我想要设计一种有效的方法来对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