遍历按列排序的矩阵元素的有效方法?

2024-09-27 23:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个scipy.sparse.coo_matrix矩阵,我想把它转换成每列的位集,以便进一步计算。(在本例中,我在100Kx1M上进行测试)。在

我现在正在做这样的事情:

bitsets = [ intbitset() for _ in range(matrix.shape[1]) ]
for i,j in itertools.izip(matrix.row, matrix.col):
  bitsets[j].add(i)

这是可行的,但是COO matrix按行迭代值。理想情况下,我希望按列迭代,然后立即构建位集,而不是每次都添加不同的位集。在

找不到迭代基于矩阵列的方法。有?在

我不介意转换成其他稀疏格式,但无法找到有效迭代矩阵的方法。(在CSC矩阵上使用nonzero()已经被证明是非常不有效的…)

谢谢!在


Tags: 方法inforrange矩阵scipy事情matrix
1条回答
网友
1楼 · 发布于 2024-09-27 23:28:22

制作一个小的稀疏矩阵:

In [82]: M = sparse.random(5,5,.2, 'coo')*2
In [83]: M
Out[83]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>'
    with 5 stored elements in COOrdinate format>
In [84]: print(M)
  (1, 3)    0.03079661961875302
  (0, 2)    0.722023291734881
  (0, 3)    0.547594065264775
  (1, 0)    1.1021150713641839
  (1, 2)    0.585848976928308

{{cd2>以及 ^{pr2}$

转换为csr对行(但不一定是列)排序。nonzero转换回coo,并以新的顺序返回行和列。在

In [86]: M.tocsr().nonzero()
Out[86]: (array([0, 0, 1, 1, 1], dtype=int32), array([2, 3, 0, 2, 3], dtype=int32))

我想说的是转换为csc对列排序,但看起来不是这样:

In [87]: M.tocsc().nonzero()
Out[87]: (array([0, 0, 1, 1, 1], dtype=int32), array([2, 3, 0, 2, 3], dtype=int32))

csr的转置产生csc:

In [88]: M.tocsr().T.nonzero()
Out[88]: (array([0, 2, 2, 3, 3], dtype=int32), array([1, 0, 1, 0, 1], dtype=int32))

我不完全理解您要做什么,或者为什么要进行列排序,但是lil格式可能会有帮助:

In [90]: M.tolil().rows
Out[90]: 
array([list([2, 3]), list([0, 2, 3]), list([]), list([]), list([])],
      dtype=object)
In [91]: M.tolil().T.rows
Out[91]: 
array([list([1]), list([]), list([0, 1]), list([0, 1]), list([])],
      dtype=object)

一般来说,稀疏矩阵的迭代速度很慢。csrcsc格式的矩阵乘法是最快的运算。许多其他操作都间接地利用了这一点(例如row sum)。另一个相对快速的操作集是那些可以直接使用data属性的操作,而不必注意行或列的值。在

coo不实现索引或迭代。csr和{}实现这些。在

相关问题 更多 >

    热门问题