2015-05-27 42 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