【问题标题】:Numpy zeros in array数组中的 Numpy 零
【发布时间】:2017-02-17 23:51:10
【问题描述】:

我正在尝试从 numpy 中获得最大性能,并且想知道是否有更好的方法来计算带有很多零的数组的点积 例如:

a = np.array([[0, 3, 0], [1, 0, 1]])
print a.dot([1, 2, 5])

这是一个小例子,但如果我们有一个更大的数组,可以说在数组中的任何位置都有 80% 的零,我的问题是有没有更好或更快速的方法来计算点积有这么多零吗?

【问题讨论】:

  • 也许使用稀疏矩阵会更快。
  • 有一个scipy.sparse 包可以创建和使用稀疏矩阵。但根据我的经验,矩阵必须具有低于 1% 的稀疏度才能获得优于 numpy dot 的速度优势(即 99% 为零)。
  • 我会研究稀疏矩阵,但你会建议一直使用它还是只在它高于 99% 时使用它@hpaulj
  • 有足够的学习曲线和限制,我不会为了加速一些dot 产品而切换。它们最初是为大型线性代数问题(有限元、差分)而开发的,但现在也可以使用机器学习。这些矩阵还有什么用途?
  • 现在只是点积我可能需要在将来转置它们,但没有别的

标签: python numpy dot-product


【解决方案1】:
In [269]: from scipy import sparse
In [270]: M=sparse.random(1000,1000,.1, 'csr')
In [271]: MA = M.A
In [272]: timeit M*M.T
10 loops, best of 3: 64 ms per loop
In [273]: timeit MA@MA.T
10 loops, best of 3: 60.4 ms per loop

我定义了一个具有指定稀疏度 10% 的随机稀疏矩阵:

In [274]: M
Out[274]: 
<1000x1000 sparse matrix of type '<class 'numpy.float64'>'
    with 100000 stored elements in Compressed Sparse Row format>
In [275]: np.allclose(MA@MA.T, (M*M.T).A)
Out[275]: True

@dot 的运算符形式(参见np.matmul)。因此,在这 10% 的稀疏度下,两种方法的时间相同(没有任何与稀疏的转换)。

对于这个随机矩阵,M*M.T 结果是密集的:

In [282]: (M*M.T)
Out[282]: 
<1000x1000 sparse matrix of type '<class 'numpy.float64'>'
    with 999964 stored elements in Compressed Sparse Row format>

稀疏时间严重依赖于稀疏性;密集的时候根本没有

In [295]: M=sparse.random(1000,1000,.01, 'csr'); MA=M.A
In [296]: timeit M*M.T
100 loops, best of 3: 2.44 ms per loop
In [297]: timeit MA@MA.T
10 loops, best of 3: 56.3 ms per loop
In [298]: M=sparse.random(1000,1000,.2, 'csr'); MA=M.A
In [299]: timeit M*M.T
10 loops, best of 3: 175 ms per loop
In [300]: timeit MA@MA.T
10 loops, best of 3: 56.3 ms per loop

稀疏往返往返,时间从 60 秒跃升至 100 毫秒

In [302]: %%timeit
     ...: M1=sparse.csr_matrix(MA)
     ...: (M1*M1.T).A
     ...: 
10 loops, best of 3: 104 ms per loop

【讨论】:

  • @ 对我不起作用,但我使用 MA.dot(MA.T)
  • 我只是在较新的 python/numpy 中偷懒。对于像这样的二维数组,结果应该是一样的。
猜你喜欢
  • 2016-11-06
  • 2014-06-08
  • 1970-01-01
  • 2018-10-05
  • 2017-10-24
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 2015-09-04
相关资源
最近更新 更多