首页 文章

在python中访问特定矩阵行中的非零元素

提问于
浏览
3

我在表格中的python中的稀疏矩阵中有非零元素位置的索引

(array([0, 1, 2], dtype=int32), array([2, 0, 0], dtype=int32), array([2, 1, 3]))

或以矩阵形式

[[0 2]
 [1 0]
 [2 0]]

我想使用这个(或其他方法,如果有的话)来执行逐行操作,只使用其他矩阵的相应非零元素,如下所示:

for r in range(rows):
    A[r,:] = np.dot(B[r,:],C.T)

基本上我需要一种方法来指定行,并且只选择该行中与矩阵B中的非零元素对应的元素 .

我无法理解的部分是由于每行/每列可以有不同数量的条目 .

2 回答

  • 1

    关于第一个元组代表什么,我有点困惑 . 它是稀疏数组的索引和值吗?例如

    In [4]: arrays=(np.array([0, 1, 2], dtype=int), np.array([2, 0, 0], dtype=int), np.array([2, 1, 3], dtype=float))
    ...
    In [6]: from scipy import sparse
    In [7]: M=sparse.csr_matrix((arrays[2],(arrays[0],arrays[1])))
    In [8]: M
    Out[8]: 
    <3x3 sparse matrix of type '<class 'numpy.float64'>'
        with 3 stored elements in Compressed Sparse Row format>
    In [9]: M.A
    Out[9]: 
    array([[ 0.,  0.,  2.],
           [ 1.,  0.,  0.],
           [ 3.,  0.,  0.]])
    
    In [10]: print(M)
      (0, 2)    2.0
      (1, 0)    1.0
      (2, 0)    3.0
    

    矩阵乘法是为这样的数组定义的:

    In [12]: M*M.T
    Out[12]: 
    <3x3 sparse matrix of type '<class 'numpy.float64'>'
        with 5 stored elements in Compressed Sparse Row format>
    In [13]: (M*M.T).A
    Out[13]: 
    array([[ 4.,  0.,  0.],
           [ 0.,  1.,  3.],
           [ 0.,  3.,  9.]])
    In [14]: M.A.dot(M.A.T)  # dense equivalent
    Out[14]: 
    array([[ 4.,  0.,  0.],
           [ 0.,  1.,  3.],
           [ 0.,  3.,  9.]])
    

    我可以用这个数组逐行实现:

    In [21]: A=M.A      # dense array
    In [22]: for r in range(3):
        print(np.dot(A[r,:],A[r,:]))
    4.0
    1.0
    9.0
    # actually this is just the diagonal
    
    In [23]: for r in range(3):   # or with the nonzero elements
        I=np.nonzero(A[r,:])
        dot = np.dot(A[r,I[0]],A[r,I[0]])
        print(dot)
    4.0
    1.0
    9.0
    

    为了它的 Value , nonzero 返回我在开始时从你的帖子中复制的数组:

    In [24]: np.nonzero(A)
    Out[24]: (array([0, 1, 2], dtype=int32), array([2, 0, 0], dtype=int32))
    In [25]: A[np.nonzero(A)]
    Out[25]: array([ 2.,  1.,  3.])
    

    稀疏矩阵也有一个 nonzero 方法:

    In [26]: M.nonzero()
    Out[26]: (array([0, 1, 2], dtype=int32), array([2, 0, 0], dtype=int32))
    

    我觉得自己正在挣扎着试图弄清楚问题和榜样 .

  • 1

    我发现你可以在python中使用布尔数组索引,所以以下是我想要实现的:

    for r in range(rows):
        A[r,B[r,:]!=0] = np.dot(B[r , B[r,:]!=0], C[: , B[r,:]!=0].T)
    

    看起来有点复杂,但它得到了正确的计算元素 . 唯一的问题是当B的维度大于索引的索引时,它会抛出索引超出范围的错误 .

相关问题