【问题标题】:What is the most efficient way to convert from a list of values to a scipy sparse matrix?从值列表转换为 scipy 稀疏矩阵的最有效方法是什么?
【发布时间】:2023-03-07 00:24:01
【问题描述】:

我有一个值列表,我正在使用循环将其转换为scipy.sparse.dok_matrix。我知道numpy.bincount,但它不适用于稀疏矩阵。我想知道是否有更有效的方法来执行此转换,因为 dok_matrix 的构建时间真的很长。

下面是一行的示例,但我通过循环缩放到二维矩阵。值x 在输入列表中出现的次数是结果矩阵的第x 元素的值。

values = [1, 3, 3, 4]
expected_result = [0, 1, 0, 2, 1]

matrix = dok_matrix((1, MAXIMUM_EXPECTED_VALUE))
for value in values:
    matrix[0, value] = matrix.get((0, card)) + 1

MAXIMUM_EXPECTED_VALUE 大约是 100000000 但len(values) < 100,这就是我使用稀疏矩阵的原因。可能题外话:MAXIMUM_EXPECTED_VALUE 范围内使用的实际值也只有 10000 多一点,但我认为散列到连续范围并转换回来可能更复杂。

【问题讨论】:

  • 为什么不能只创建一个包含列索引的数组和一个包含值的数组并使用标准构造函数?另外 dok 类型的稀疏矩阵基本没用。
  • 你指的是标准的numpy数组吗?是的,我必须为实际应用从 dok 转换为 csr。

标签: python scipy sparse-matrix


【解决方案1】:

看起来标准的coo 样式输入适合您的情况:

In [143]: from scipy import sparse
In [144]: values = [1,3,3,4]
In [145]: col = np.array(values)
In [146]: row = np.zeros_like(col)
In [147]: data = np.ones_like(col)
In [148]: M = sparse.coo_matrix((data, (row,col)), shape=(1,10))
In [149]: M
Out[149]: 
<1x10 sparse matrix of type '<class 'numpy.int64'>'
    with 4 stored elements in COOrdinate format>
In [150]: M.A
Out[150]: array([[0, 1, 0, 2, 1, 0, 0, 0, 0, 0]])

【讨论】:

  • 这是否可以扩展到超过一行的整个二维矩阵? (例如,在我的示例中,我从 0 循环到行数,而不是 matrix[0, value]
  • 当然,row 数组可以用arange 来创建。在更复杂的情况下,这些数组是使用列表追加/扩展或连接数组列表构建的。
  • 与 vstacking 单行 coo 矩阵相比效率最高吗?
  • sparse.vstack 以所有输入的coo 开头,并结合它们的属性来制作新矩阵的coo 输入。它使用sparse.bmat
猜你喜欢
  • 2020-12-07
  • 2023-04-10
  • 2018-12-10
  • 2013-11-16
  • 2014-09-16
  • 2020-11-26
  • 2015-12-09
  • 2012-08-31
  • 2014-12-21
相关资源
最近更新 更多