我有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中的非零元素相对应的元素。
我无法理解的部分是因为每一行/列都有不同数量的条目。

最佳答案

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

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

值得一提的是,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))

我觉得我在挣扎,试图弄明白这个问题和这个例子。

09-10 01:50
查看更多