所以,我正在使用非常稀疏的numpy数组进行一些Kmeans分类 - 很多很多零 . 我想我会使用scipy的'稀疏'软件包来减少存储开销,但我对如何创建数组而不是矩阵有点困惑 .
我已经完成了关于如何创建稀疏矩阵的教程:http://www.scipy.org/SciPy_Tutorial#head-c60163f2fd2bab79edd94be43682414f18b90df7
为了模拟一个数组,我只是创建一个1xN矩阵,但正如你可能猜到的,Asp.dot(Bsp)不能正常工作,因为你不能将两个1xN矩阵相乘 . 我必须将每个数组转换为Nx1,这非常蹩脚,因为我会为每个点积计算做这个 .
接下来,我尝试创建一个NxN矩阵,其中第1列==第1行(这样您可以将两个矩阵相乘,只需将左上角作为点积),但结果证明效率非常低 .
我喜欢使用scipy的稀疏包作为numpy的数组()的神奇替代品,但到目前为止,我还不确定该怎么做 .
有什么建议?
3 回答
使用基于行或列的
scipy.sparse
格式:csc_matrix
和csr_matrix
.它们使用高效的C实现(包括乘法),并且转置是无操作(特别是如果你调用
transpose(copy=False)
),就像使用numpy数组一样 .编辑:通过ipython的一些时间:
现在
x_csr
和x_dok
稀疏50%:时间安排:
所以看起来我说谎了 . 换位 is 非常便宜,但csr * csc没有高效的C实现(在最新的scipy 0.9.0中) . 每次调用都会构造一个新的csr对象:-(
作为一个黑客(虽然现在scipy相对稳定),你可以直接在稀疏数据上做点积:
注意,这最后一种方法再次进行了numpy密集乘法 . 稀疏度为50%,因此实际上比
dot(x, x)
快2倍 .您可以创建一个现有的2d稀疏数组的子类
我不确定它是更好还是更快,但你可以这样做以避免使用转置:
这只是采用两个矩阵的逐元素乘积并对产品求和 . 您可以使用上述语句作为点积来创建您正在使用的任何矩阵格式的子类 .
然而,转换它们可能更容易:
这似乎不是很多,但你也可以创建一个子类并修改 mul ()方法 .