簡體   English   中英

在python中訪問特定矩陣行中的非零元素

[英]Accessing non-zero elements in specific row of matrix in python

我在表格中的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))

我覺得自己正在掙扎着試圖弄清楚問題和榜樣。

我發現你可以在python中使用布爾數組索引,所以以下是我想要實現的:

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

看起來有點復雜,但它得到了正確的計算元素。 唯一的問題是當B的維數大於索引的范圍時拋出索引超出范圍的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM