Python 从稀疏矩阵中提取项目
我正在处理一系列的文本语料库,在这样做的过程中,我需要构建一个共现矩阵。我目前正在测试编写和测试我的代码,所以每次运行我都会得到一个不同的矩阵(因为Python 从稀疏矩阵中提取项目,python,scipy,sparse-matrix,Python,Scipy,Sparse Matrix,我正在处理一系列的文本语料库,在这样做的过程中,我需要构建一个共现矩阵。我目前正在测试编写和测试我的代码,所以每次运行我都会得到一个不同的矩阵(因为list(set())是无序的。我使用scipy.sparse.coo_matrix()构建了一个稀疏矩阵)并且希望能够使用该类型构造生成的坐标和值。我认为这将是最快、最有效的方法。在我尝试访问这些值时,我看到了这些值 [<1x16 sparse matrix of type '<class 'numpy.float32'>' wi
list(set())
是无序的。我使用scipy.sparse.coo_matrix()构建了一个稀疏矩阵)
并且希望能够使用该类型构造生成的坐标和值。我认为这将是最快、最有效的方法。在我尝试访问这些值时,我看到了这些值
[<1x16 sparse matrix of type '<class 'numpy.float32'>'
with 10 stored elements in Compressed Sparse Row format>, <1x16 sparse matrix of type '<class 'numpy.float32'>'
with 4 stored elements in Compressed Sparse Row format>, <1x16 sparse matrix of type '<class 'numpy.float32'>'
with 4 stored elements in Compressed Sparse Row format>, <1x16 sparse matrix of type '<class 'numpy.float32'>'
with 7 stored elements in Compressed Sparse Row format>, <1x16 sparse matrix of type '<class 'numpy.float32'>'
我可以想象,检索这些值是可能的
对于上面的示例,我提取了以下实例:
row = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,
4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,
9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13,
13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15,
15, 15, 15, 15, 15, 15, 15]
column = [1, 4, 6, 7, 11, 12, 13, 14, 15, 0, 4, 9, 12, 13, 14, 15, 4, 5, 12, 13,
4, 9, 13, 14, 0, 1, 2, 3, 5, 8, 10, 12, 13, 14, 2, 4, 12, 13, 0, 14,
15, 0, 8, 11, 13, 4, 7, 10, 11, 1, 3, 12, 14, 4, 8, 11, 13, 0, 7, 8,
10, 0, 1, 2, 4, 5, 9, 13, 0, 1, 2, 3, 4, 5, 7, 10, 12, 0, 1, 3, 4, 6,
9, 15, 0, 1, 6, 14]
values = [0.5, 1.0, 0.5, 1.0, 1.0, 1.0, 0.5, 0.5, 1.0, 1.0, 0.5, 0.5, 1.0, 0.5,
1.0, 0.5, 1.0, 0.5, 1.0, 0.5, 0.5, 1.0, 0.5, 1.0, 1.0, 1.0, 1.0, 0.5,
0.5, 1.0, 0.5, 0.5, 1.0, 1.0, 1.5, 2.0, 1.0, 2.5, 1.0, 3.0, 1.0, 0.5,
1.5, 2.0, 1.0, 1.0, 2.0, 0.5, 1.0, 0.5, 2.0, 2.0, 0.5, 4.0, 0.5, 0.5,
0.5, 1.0, 1.0, 0.5, 0.5, 1.0, 0.5, 1.0, 1.0, 0.5, 0.5, 0.5, 2.5, 1.0,
4.0, 1.0, 1.0, 1.5, 1.0, 1.0, 1.0, 0.5, 1.0, 0.5, 1.0, 1.0, 0.5, 3.0,
2.0, 0.5, 0.5, 1.5]
sps_array = sparse.coo_matrix((values, (row, column)), shape=(16, 16))
目前,我能够使用sps\u数组转换sps\u数组
list1 = list(np.nonzero(sps_array > 0)[0])
list2 = list(np.nonzero(sps_array > 0)[1])
并为
循环创建以下,以重建坐标
index = 0
sps_coordinates = []
for i in range(token_size):
for j in range(list1_count[i]):
sps_coordinates.append((list1[index+j], list2[index+j]))
index += list1_count[i]
我通过
list(sps_array[sps_array > 0]
有没有一种更有效的方法来获取与我所做工作相关的坐标和值?通过复制粘贴,我可以构建您的sps\u数组
:
In [2126]: sps_array
Out[2126]:
<16x16 sparse matrix of type '<class 'numpy.float64'>'
with 88 stored elements in COOrdinate format>
稀疏矩阵具有非零
方法,其代码为:
A = self.tocoo()
nz_mask = A.data != 0
return (A.row[nz_mask],A.col[nz_mask])
它确保矩阵采用coo
格式,确保数据中没有任何“隐藏”零,并返回行
和列
属性
如果矩阵已经是coo
,则不需要这样做,但如果矩阵是csr
格式,则需要这样做
因此,您不需要执行密集的toarray
和np.nonzero
函数。但是np.nonzero(sps_数组)
确实有效,因为它将任务委托给sps.array.nonzero()
将转置
应用于非零
会得到一个可能是您想要的数组:
In [2136]: np.transpose(np.nonzero(sps_array))
Out[2136]:
array([[ 0, 1],
[ 0, 4],
[ 0, 6],
[ 1, 7],
[ 1, 11],
[ 1, 12],
....
事实上,有一个np函数可以做到这一点(对于任何数组)(查看其代码或文档):
(除非担心负值,否则不需要使用非零(sps\u array>0)
。)当我尝试使用我创建的稀疏矩阵使用.row
或.col
时,我观察到了奇怪的行为。我看到了属性错误:row not found
,但当我对上面的示例尝试同样的方法时,我打印出了一个列表。使用.data
时,bevahiour不存在,而且在任何情况下,值都不存在我已经通过使用np.transpose(np.nonzero(sps_数组))解决了这个问题
,由@hpaulj建议,并通过切片生成适当的列和行列表。我怀疑您的稀疏矩阵不是coo
格式。只有该格式具有row
和col
属性。非零
使用tocoo
将其输入转换为coo(如果需要)。如果更简单,请随意使用非零
。
A = self.tocoo()
nz_mask = A.data != 0
return (A.row[nz_mask],A.col[nz_mask])
In [2136]: np.transpose(np.nonzero(sps_array))
Out[2136]:
array([[ 0, 1],
[ 0, 4],
[ 0, 6],
[ 1, 7],
[ 1, 11],
[ 1, 12],
....
np.argwhere(sps_array)