gpt4 book ai didi

python - 避免在 numpy.where() 中被零除

转载 作者:行者123 更新时间:2023-12-03 16:10:39 25 4
gpt4 key购买 nike

我有两个 numpy 数组 a , b形状相同,b有几个零。我想将输出数组设置为 a / b哪里b不为零,并且 a除此以外。以下工作,但产生警告,因为 a / b首先在任何地方计算。

import numpy

a = numpy.random.rand(4, 5)
b = numpy.random.rand(4, 5)
b[b < 0.3] = 0.0

A = numpy.where(b > 0.0, a / b, a)
/tmp/l.py:7: RuntimeWarning: divide by zero encountered in true_divide
A = numpy.where(b > 0.0, a / b, a)
mask 过滤除法不保持形状,所以这不起作用:
import numpy

a = numpy.random.rand(4, 5)
b = numpy.random.rand(4, 5)
b[b < 0.3] = 0.0

mask = b > 0.0
A = numpy.where(mask, a[mask] / b[mask], a)
ValueError: operands could not be broadcast together with shapes (4,5) (14,) (4,5)
关于如何避免警告的任何提示?

最佳答案

只需使用回退值(不满足条件的值)或数组初始化输出数组,然后屏蔽以选择要分配的条件满足值 -

out = a.copy()
out[mask] /= b[mask]
如果您正在寻找性能,我们可以使用修改后的 b对于该部门 -
out = a / np.where(mask, b, 1)
更进一步,使用 numexpr 为它充电对于 b 中正值的这种特殊情况(>=0) -
import numexpr as ne

out = ne.evaluate('a / (1 - mask + b)')
基准测试
enter image description here
重现情节的代码:
import perfplot
import numpy
import numexpr

numpy.random.seed(0)


def setup(n):
a = numpy.random.rand(n)
b = numpy.random.rand(n)
b[b < 0.3] = 0.0
mask = b > 0
return a, b, mask


def copy_slash(data):
a, b, mask = data
out = a.copy()
out[mask] /= b[mask]
return out


def copy_divide(data):
a, b, mask = data
out = a.copy()
return numpy.divide(a, b, out=out, where=mask)


def slash_where(data):
a, b, mask = data
return a / numpy.where(mask, b, 1.0)


def numexpr_eval(data):
a, b, mask = data
return numexpr.evaluate('a / (1 - mask + b)')


b = perfplot.bench(
setup=setup,
kernels=[copy_slash, copy_divide, slash_where, numexpr_eval],
n_range=[2 ** k for k in range(24)],
xlabel="n"
)
b.save("out.png")

关于python - 避免在 numpy.where() 中被零除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63630179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com