将“for”循环转换为矩阵表达式?

2024-05-12 23:02:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

矩阵C

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

载体delta_E

^{pr2}$

A是一个由零组成的矩阵,其维数为C,向量{},长度为3,列表{}:

    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索引增加一,并将i1中包含的E索引增加{}:

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

结果是:

{cd5>矩阵^:

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

矩阵E

        array([4, 7, 0])

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


Tags: 列表for表达式np矩阵wherearray向量
1条回答
网友
1楼 · 发布于 2024-05-12 23:02:18
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的无缓冲替代方案。在

^{pr2}$

对于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])

相关问题 更多 >