我正在尝试设计一种有效的方法在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 :(得分:0)
您可以将该部门应用于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]
我怀疑它是否更快。但对于其他情况,例如包含B
的{{1}},这是一种避免错误/警告的方法。关于0
必须有一些SO问题。
答案 1 :(得分:0)
有趣的问题。我没有做一个非常彻底的测试,但是通过在分母中搜索1来过滤除法似乎会慢慢减慢,即使1的分数非常高(99%)(参见下面的代码)。这表明搜索1 get
会降低速度。也许Numpy已经以这种方式优化阵列划分?
denom[np.where(denom<>1.0)]...