[英]How to access sparse matrix elements?
type(A)
<class 'scipy.sparse.csc.csc_matrix'>
A.shape
(8529, 60877)
print A[0,:]
(0, 25) 1.0
(0, 7422) 1.0
(0, 26062) 1.0
(0, 31804) 1.0
(0, 41602) 1.0
(0, 43791) 1.0
print A[1,:]
(0, 7044) 1.0
(0, 31418) 1.0
(0, 42341) 1.0
(0, 47125) 1.0
(0, 54376) 1.0
print A[:,0]
#nothing returned
現在我不明白的是A[1,:]
應該從第二行選擇元素,但我通過print A[1,:]
從第一行獲取元素。 此外, print A[:,0]
應該返回第一列,但我沒有打印任何內容。 為什么?
A[1,:]
本身是一個形狀為 (1, 60877) 的稀疏矩陣。 這就是你正在打印的,它只有一行,所以所有的行坐標都是 0。
例如:
In [41]: a = csc_matrix([[1, 0, 0, 0], [0, 0, 10, 11], [0, 0, 0, 99]])
In [42]: a.todense()
Out[42]:
matrix([[ 1, 0, 0, 0],
[ 0, 0, 10, 11],
[ 0, 0, 0, 99]], dtype=int64)
In [43]: print(a[1, :])
(0, 2) 10
(0, 3) 11
In [44]: print(a)
(0, 0) 1
(1, 2) 10
(1, 3) 11
(2, 3) 99
In [45]: print(a[1, :].toarray())
[[ 0 0 10 11]]
您可以選擇列,但如果列中沒有非零元素,則使用print
輸出時不會顯示任何內容:
In [46]: a[:, 3].toarray()
Out[46]:
array([[ 0],
[11],
[99]])
In [47]: print(a[:,3])
(1, 0) 11
(2, 0) 99
In [48]: a[:, 1].toarray()
Out[48]:
array([[0],
[0],
[0]])
In [49]: print(a[:, 1])
In [50]:
最后一次print
調用沒有顯示輸出,因為a[:, 1]
列沒有非零元素。
要使用與問題的詳細信息不同的技術來回答標題的問題:
csc_matrix
為您提供了.nonzero()
方法。
鑒於:
>>> import numpy as np
>>> from scipy.sparse.csc import csc_matrix
>>>
>>> row = np.array( [0, 1, 3])
>>> col = np.array( [0, 2, 3])
>>> data = np.array([1, 4, 16])
>>> A = csc_matrix((data, (row, col)), shape=(4, 4))
您可以通過以下方式訪問指向非零數據的索引:
>>> rows, cols = A.nonzero()
>>> rows
array([0, 1, 3], dtype=int32)
>>> cols
array([0, 2, 3], dtype=int32)
然后您可以使用它來訪問您的數據,而無需制作稀疏矩陣的密集版本:
>>> [((i, j), A[i,j]) for i, j in zip(*A.nonzero())]
[((0, 0), 1), ((1, 2), 4), ((3, 3), 16)]
如果是使用TfidfTransformer
計算 TFIDF 分數,則可以通過tfidf.idf_
獲得 IDF。 然后是稀疏數組名稱,比如 'a', a.toarray().
toarray
返回一個 ndarray; todense
返回一個矩陣。 如果你想要一個矩陣,使用todense
; 否則,使用toarray
。
我完全承認所有其他給出的答案。 這只是一種不同的方法。
為了演示這個例子,我創建了一個新的稀疏矩陣:
from scipy.sparse.csc import csc_matrix
a = csc_matrix([[1, 0, 0, 0], [0, 0, 10, 11], [0, 0, 0, 99]])
print(a)
輸出:
(0, 0) 1
(1, 2) 10
(1, 3) 11
(2, 3) 99
為了輕松訪問它,就像我們訪問列表的方式一樣,我將其轉換為列表。
temp_list = []
for i in a:
temp_list.append(list(i.A[0]))
print(temp_list)
輸出:
[[1, 0, 0, 0], [0, 0, 10, 11], [0, 0, 0, 99]]
這可能看起來很愚蠢,因為我正在創建一個稀疏矩陣並將其轉換回來,但是有一些函數,如TfidfVectorizer和其他函數返回一個稀疏矩陣作為輸出,處理它們可能很棘手。 這是從稀疏矩陣中提取數據的一種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.