Numpy:在Divisor中有许多1的阵列分区

时间:2015-05-27 16:11:17

标签: python arrays numpy

我正在尝试设计一种有效的方法在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进行了优化,但我的直觉是它不是。

请问你的想法?

2 个答案:

答案 0 :(得分: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]

我怀疑它是否更快。但对于其他情况,例如包含B的{​​{1}},这是一种避免错误/警告的方法。关于0必须有一些SO问题。

答案 1 :(得分:0)

有趣的问题。我没有做一个非常彻底的测试,但是通过在分母中搜索1来过滤除法似乎会慢慢减慢,即使1的分数非常高(99%)(参见下面的代码)。这表明搜索1 get会降低速度。也许Numpy已经以这种方式优化阵列划分?

denom[np.where(denom<>1.0)]...