我认为这是一项常规任务sklearn
,所以包中必须有一些工具可以做到这一点,或者其他问题的答案。我们需要添加正确的标签。
但只是根据我的知识进行工作numpy
and sparse
,我会做什么:
制作一个示例二维数组 - N 行,2 列,包含字符值:
In [638]: A=np.array([('a','b'),('b','d'),('a','d'),('b','c'),('d','e')])
In [639]: A
Out[639]:
array([['a', 'b'],
['b', 'd'],
['a', 'd'],
['b', 'c'],
['d', 'e']],
dtype='<U1')
Use np.unique
识别唯一的字符串,并作为奖励从这些字符串到原始数组的映射。这是该任务的主力。
In [640]: k1,k2,k3=np.unique(A,return_inverse=True,return_index=True)
In [641]: k1
Out[641]:
array(['a', 'b', 'c', 'd', 'e'],
dtype='<U1')
In [642]: k2
Out[642]: array([0, 1, 7, 3, 9], dtype=int32)
In [643]: k3
Out[643]: array([0, 1, 1, 3, 0, 3, 1, 2, 3, 4], dtype=int32)
我可以重塑它inverse
数组来标识每个条目的行和列A
.
In [644]: rows,cols=k3.reshape(A.shape).T
In [645]: rows
Out[645]: array([0, 1, 0, 1, 3], dtype=int32)
In [646]: cols
Out[646]: array([1, 3, 3, 2, 4], dtype=int32)
有了这些,构造一个稀疏矩阵就很简单了1
在每个“十字路口”。
In [648]: M=sparse.coo_matrix((np.ones(rows.shape,int),(rows,cols)))
In [649]: M
Out[649]:
<4x5 sparse matrix of type '<class 'numpy.int32'>'
with 5 stored elements in COOrdinate format>
In [650]: M.A
Out[650]:
array([[0, 1, 0, 1, 0],
[0, 0, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]])
第一行,a
第 2 列和第 4 列有值,b
and d
。等等。
===========================
本来我有:
In [648]: M=sparse.coo_matrix((np.ones(k1.shape,int),(rows,cols)))
这是错误的。这data
数组应该匹配rows
and cols
在形状上。这里它没有引发错误,因为k1
恰好大小相同。但如果使用不同的组合,独特的值可能会引发错误。
===================
这种方法假设整个数据库,A
可以加载到内存中。unique
可能需要类似的内存使用。最初是一个coo
矩阵可能不会增加内存使用量,因为它将使用作为参数提供的数组。但任何计算和/或转换csr
或其他格式将进行进一步的复制。
我可以想象通过分块加载数据库并使用其他结构来获取唯一值和映射来解决内存问题。您甚至可以构建一个coo
来自块的矩阵。但迟早你会遇到记忆问题。 scikit 代码将制作该稀疏矩阵的一个或多个副本。