我想要設計一種有效的方法來對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進行了優化,但我的直覺是它不是。
您的想法?
我想要設計一種有效的方法來對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進行了優化,但我的直覺是它不是。
您的想法?
您可以將師的A
和B
所選項目:
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]
我懷疑它的速度更快。但對於其他情況,例如包含0
的B
,它是避免錯誤/警告的一種方式。必須有許多關於numpy division by zero
的SO問題。
有趣的問題。我沒有做一個非常徹底的測試,但是通過在分母中搜索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
我試過用hpaulj的布爾索引方法('num [num <> 1]/= denom [num <> 1]'),並得到相同的結果。 – rjonnal
檢查1s並跳過這個部門將會比僅僅分割更昂貴,不管你怎麼做。如果你可以跟蹤非1數組元素的位置,所以你不必經過所有的1來定位非1,你可能可以削減一些時間,但要確保你實際計算時間。 – user2357112