【问题标题】:Convert a 'for' loop into a matrix expression?将“for”循环转换为矩阵表达式?
【发布时间】:2017-06-25 00:37:57
【问题描述】:

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

矩阵C:

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

一个向量delta_E:

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

A 是一个由零组成的矩阵,维数为C,一个向量E,长度为3,一个列表indices

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

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循环转换为矩阵表达式?

【问题讨论】:

  • 你看过 numpy 吗?
  • 是的,sobek,我试试……但你知道,numpy 有很多方法。
  • 我正在尝试重新创建您的计算,并且在迭代中遇到了一些错误。枚举需要一个 zip,delta_E[4] 的索引超出范围。

标签: python numpy matrix


【解决方案1】:
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])

【讨论】:

  • 非常感谢,你让我开心!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2012-08-10
  • 2013-03-05
  • 1970-01-01
相关资源
最近更新 更多