从值列表转换为 scipy 稀疏矩阵的最有效方法是什么?

What is the most efficient way to convert from a list of values to a scipy sparse matrix?

我有一个值列表,我正在使用循环将其转换为 scipy.sparse.dok_matrix. I'm aware of 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 多一点,但我认为散列到连续范围并转换回来可能更复杂。

看起来标准 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]])