我正在编写一个函数,其中我想将2维矩阵存储为更大的2维矩阵的子集。除了einsum的结果没有存储在矩阵E(第3行到最后一行)之外,所有代码似乎都正常工作。有关如何解决此问题的任何建议吗?
def two_cycles(A):
nonzeroSubset = np.diag(la.matrix_power(A,4) - la.matrix_power(A,2))
x = np.argsort(nonzeroSubset)[:100]
subset = A[x,:][:,x]
n = len(A)
E = np.zeros((n,n))
E[x][:,x] = np.einsum('ij,ji->ij',subset,subset)
fourCycles = np.array(np.nonzero(E)).T
return fourCycles
答案 0 :(得分:3)
x = np.argsort(nonzeroSubset)[:100]
...
E[x][:,x] = ....
所以x
是一个索引列表。这意味着E[x]
使用高级索引并且是副本。 E[...][...]
可以返回有用的值(如A[x,:][:,x]
中所述),但如果第一个索引生成副本,则不能用于赋值。一般情况下,避免使用numpy
中的双括号。而是弄清楚如何使用一组括号(和多维索引)执行所需的索引。
您是否尝试将值分配给E
的对角线(按特定顺序)?
这是一种获取和分配数组对角线的方法:
In [379]: A=np.arange(9).reshape(3,3)
In [380]: ind=np.diag_indices(3)
In [381]: ind
Out[381]: (array([0, 1, 2]), array([0, 1, 2]))
In [382]: A[ind]
Out[382]: array([0, 4, 8])
In [383]: A[ind]=[8,4,0]
In [384]: A
Out[384]:
array([[8, 1, 2],
[3, 4, 5],
[6, 7, 0]])
我认为在你的情况下这应该有用(但还没有测试过):
x = np.argsort(nonzeroSubset)[:100]
subset = A[x,x] # diagonals of A in a sorted order
....
E[x,x] = np.einsum('ij,ji->ij',subset,subset)
# assignment to diagonal in the same order