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,:]时应该从第2行中选择元素,但是我从打印中的第1行获取元素。当我输入应该返回第一列的A [:,0]但是我没有打印任何内容。为什么呢?
答案 0 :(得分:35)
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]
没有非零元素。
答案 1 :(得分:15)
使用与问题详情不同的技巧来回答标题的问题:
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)]
答案 2 :(得分:1)
如果是使用TfidfTransformer
计算TFIDF分数,则yu可以通过tfidf.idf_
获得IDF。然后是稀疏数组名称,例如'a',a.toarray().
toarray
返回一个ndarray; todense
返回一个矩阵。如果您想要矩阵,请使用todense
;否则,请使用toarray
。
答案 3 :(得分:1)
我完全同意所有其他给出的答案。这只是一种不同的方法。
为演示此示例,我将创建一个新的稀疏矩阵:
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 ,还有一些函数返回稀疏矩阵作为输出并处理它们可能很棘手。这是一种从稀疏矩阵中提取数据的方法。