Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从稀疏矩阵中提取项目_Python_Scipy_Sparse Matrix - Fatal编程技术网

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)