Python Numpy:除数中有多个1的数组除法

Python Numpy:除数中有多个1的数组除法,python,arrays,numpy,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 这里,实际上只需要两个除法操作实例。我不确定Numpy是否已经针对除法1进行了优化,但我的直觉是它不是 请给出您的想法?您可以将划分应用于A和B的选定项目: 还有一个布尔索引:a[B>1]/=B[B>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
这里,实际上只需要两个除法操作实例。我不确定Numpy是否已经针对除法1进行了优化,但我的直觉是它不是


请给出您的想法?

您可以将划分应用于A和B的选定项目:

还有一个布尔索引:a[B>1]/=B[B>1]


我怀疑它是否更快。但对于其他情况,例如包含0的B,这是一种避免错误/警告的方法。一定有很多关于numpy除以0的问题。

有趣的问题。我没有做一个非常彻底的测试,但是通过搜索分母中的1来过滤除法似乎会稍微减慢速度,即使1的分数非常高99%,请参见下面的代码。这表明对1的denom[np.wheredenom1.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

不管你怎么做,检查1和跳过除法都比除法要昂贵得多。如果您可以跟踪非1数组元素的位置,这样您就不必通过所有的1来定位非1,那么您可能可以节省一些时间,但请确保您实际计时。我使用hpaulj的布尔索引方法num[num1]/=denom[num1]尝试了这一方法,并获得了相同的结果。
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