问题描述
我有一个值列表,我使用循环将这些值转换为 scipy.sparse.dok_matrix
。我知道 numpy.bincount
但它不适用于稀疏矩阵。我想知道是否有更有效的方法来执行此转换,因为 dok_matrix
的构建时间非常长。
下面是一行的示例,但我通过循环缩放到 2D 矩阵。值 x
在输入列表中出现的次数是结果矩阵的第 x
个元素的值。
values = [1,3,4]
expected_result = [0,1,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,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,2,0]])