Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 转换为';对于';循环到矩阵表达式中?_Python_Numpy_Matrix - Fatal编程技术网

Python 转换为';对于';循环到矩阵表达式中?

Python 转换为';对于';循环到矩阵表达式中?,python,numpy,matrix,Python,Numpy,Matrix,我需要使用矩阵形式为表达式中的循环转换。我有一个矩阵C: array([[0, 1, 1], [1, 0, 0], [1, 0, 0]]) 矩阵C: array([[0, 1, 1], [1, 0, 0], [1, 0, 0]]) 向量增量: array([ 4., 2., 4., 1.]) A是一个维数为C的零矩阵,长度为3的向量E,以及索引列表: indices

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

    array([[0, 1, 1],
           [1, 0, 0],
           [1, 0, 0]])
矩阵
C

    array([[0, 1, 1],
           [1, 0, 0],
           [1, 0, 0]])
向量
增量:

    array([ 4.,  2.,  4.,  1.])
A
是一个维数为
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]
我想将
i0
i1
中包含的
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
循环转换为矩阵表达式

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

你看过努比吗?是的,索贝克,我试着。。。但是你知道,numpy有很多方法。我试图重新创建你的计算,在迭代中遇到了一些错误。enumerate需要一个邮政编码,
delta_E[4]
索引超出范围。非常感谢,你让我开心!