您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

稀疏稀疏…数组?

稀疏稀疏…数组?

使用scipy.sparse基于行或列的格式:csc_matrixcsr_matrix

它们使用幕后高效的C实现(包括乘法),并且转置是无操作的(尤其是如果调用transpose(copy=False)),就像numpy数组一样。

编辑:通过ipython的一些时间:

import numpy, scipy.sparse
n = 100000
x = (numpy.random.rand(n) * 2).astype(int).astype(float) # 50% sparse vector
x_csr = scipy.sparse.csr_matrix(x)
x_dok = scipy.sparse.dok_matrix(x.reshape(x_csr.shape))

现在x_csrx_dok稀疏度为50%:

print repr(x_csr)
<1x100000 sparse matrix of type '<type 'numpy.float64'>'
        with 49757 stored elements in Compressed Sparse Row format>

和时间:

timeit numpy.dot(x, x)
10000 loops, best of 3: 123 us per loop

timeit x_dok * x_dok.T
1 loops, best of 3: 1.73 s per loop

timeit x_csr.multiply(x_csr).sum()
1000 loops, best of 3: 1.64 ms per loop

timeit x_csr * x_csr.T
100 loops, best of 3: 3.62 ms per loop

所以看起来我在撒谎。换位 很便宜,但CSR * CSC没有高效的C实现(在最新的0.9.0 SciPy的)。每个调用中都会构造一个新的csr对象:-(

作为黑客(尽管现在scipy相对稳定),您可以直接在稀疏数据上进行点积运算:

timeit numpy.dot(x_csr.data, x_csr.data)
10000 loops, best of 3: 62.9 us per loop

请注意,这最后一种方法会再次执行Numpy密集乘法。稀疏度为50%,因此实际上比dot(x, x)2倍快。

其他 2022/1/1 18:30:52 有443人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶