索引numpy数组不起作用

时间:2016-05-02 02:57:52

标签: python python-2.7 numpy scipy

我正在编写一个函数,其中我想将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

1 个答案:

答案 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