gpt4 book ai didi

python - 将 'for' 循环转换为矩阵表达式?

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:01 25 4
gpt4 key购买 nike

我需要使用矩阵形式转换表达式中的 for 循环。我有一个矩阵C:

矩阵C:

    array([[0, 1, 1],
[1, 0, 0],
[1, 0, 0]])

矢量delta_E:

    array([ 4.,  2.,  4.,  1.])

A 是一个由 0 组成的矩阵,其维度为 C、一个长度为 3 的向量 E 以及一个 列表>指数:

    indices = [1, 1, 0, 1]

我找到了 C 的列索引:

    i0, i1 = np.where(C[indices] == 1)

他们是:

    i0 = [0, 1, 2, 3]
i1 = [0, 0, 1, 0]

我想将 i0i1 中包含的 A 索引增加 1,并将 E 增加delta_E 包含在 i1 中的 code> 索引:

for k, i, j in enumerate(indices[i0], i1):
A[i,j] += 1
A[j,i] += 1
E[i] += delta_E[k]

结果是:

    矩阵A:

        array([[0, 4, 1],
[4, 0, 0],
[1, 0, 0]])

    矩阵E:

        array([4, 7, 0])

是否可以将上面的for循环转换为矩阵表达式?

最佳答案

In [182]: for k,(i,j) in enumerate(zip(indices[i0], i1)):
...: print(k,i,j)
...:
...:
0 1 0
1 1 0
2 0 1
3 0 2
4 1 0

虽然k 是唯一的,但i,j 索引有重复项。用整个数组计算替换 += 步骤将需要使用 add.at,它是 A[i] += b 的无缓冲替代方案.

In [190]: A = np.zeros_like(C)
In [191]: np.add.at(A,(indices[i0],i1),1)
In [192]: np.add.at(A,(i1,indices[i0]),1)
In [193]: A
Out[193]:
array([[0, 4, 1],
[4, 0, 0],
[1, 0, 0]])

对于E,我无法复制你的值,但我可以复制循环

In [200]: delta_E = np.array([4,2,4,1,0])
In [204]: E = np.zeros(3,int)
In [205]: for k,i in enumerate(indices[i0]): # your loop
...: E[i] += delta_E[k]
...:
In [206]: E
Out[206]: array([5, 6, 0])
In [207]: E = np.zeros(3,int)
In [208]: np.add.at(E,indices[i0],delta_E)
In [209]: E
Out[209]: array([5, 6, 0])

关于python - 将 'for' 循环转换为矩阵表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44737379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com