2017-02-17 68 views
1

我试图获得最大表现出来numpy的和不知道是否有更好的方法来计算点积有,有很多零的它 例如数组:numpy的零

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

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

+0

也许使用稀疏矩阵会更快。 – Akavall

+1

有一个'scipy.sparse'包创建和使用稀疏矩阵。但根据我的经验,矩阵必须具有低于1%的稀疏性才能获得超过numpy“点”(即99%零)的速度优势。 – hpaulj

+0

我会研究稀疏矩阵,但是你会推荐一直使用它,或者只是当它高于99%@hpaulj – Glacier11

回答

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 [email protected] 
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([email protected], (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 [email protected] 
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 [email protected] 
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 
+0

@对我来说不起作用,但是我使用了MA.dot(MA.T) – Glacier11

+0

我只是懒惰地在一个新的Python/numpy中工作。对于像这样的二维数组,结果应该是相同的。 – hpaulj