2015-05-27 18 views
1

我想要设计一种有效的方法来对NumPy执行数组除法,其中除数主要由1组成。Numpy:在除数中有许多1的数组部分

import numpy as np 
A = np.random.rand(3,3) 
B = np.array([[1,1,3],[1,1,1],[1,4,1]]) 

Result = A/B 

这里,实际上只需要2次除法操作。我不确定Numpy是否已经通过1进行了优化,但我的直觉是它不是。

您的想法?

+0

检查1s并跳过这个部门将会比仅仅分割更昂贵,不管你怎么做。如果你可以跟踪非1数组元素的位置,所以你不必经过所有的1来定位非1,你可能可以削减一些时间,但要确保你实际计算时间。 – user2357112

回答

0

您可以将师的AB所选项目:

In [249]: A=np.arange(9.).reshape(3,3) 

In [250]: B = np.array([[1,1,3],[1,1,1],[1,4,1]]) 

In [251]: I=np.nonzero(B>1) 

In [252]: I 
Out[252]: (array([0, 2], dtype=int32), array([2, 1], dtype=int32)) 

In [253]: A[I] /= B[I] 

In [254]: A 
Out[254]: 
array([[ 0.  , 1.  , 0.66666667], 
     [ 3.  , 4.  , 5.  ], 
     [ 6.  , 1.75  , 8.  ]]) 

另外一个布尔值指标:A[B>1] /= B[B>1]

我怀疑它的速度更快。但对于其他情况,例如包含0B,它是避免错误/警告的一种方式。必须有许多关于numpy division by zero的SO问题。

0

有趣的问题。我没有做一个非常彻底的测试,但是通过在分母中搜索1来过滤分区似乎稍微减缓了一些事情,即使1的分数非常高(99%)(请参见下面的代码)。这表明搜索1的denom[np.where(denom<>1.0)]...会减慢速度。也许Numpy已经以这种方式优化了阵列分割?

import numpy as np 

def div(filter=False): 
    np.random.seed(1234) 
    num = np.random.rand(1024) 
    denom = np.random.rand(1024) 
    denom[np.where(denom>.01)] = 1.0 
    if not filter: 
     return num/denom 
    else: 
     idx = np.where(denom<>1.0)[0] 
     num[idx]/=denom[idx] 
     return num 

In [17]: timeit div(True) 
10000 loops, best of 3: 89.7 µs per loop 

In [18]: timeit div(False) 
10000 loops, best of 3: 69.2 µs per loop 
+0

我试过用hpaulj的布尔索引方法('num [num <> 1]/= denom [num <> 1]'),并得到相同的结果。 – rjonnal