我想要一个除法方法,它返回 a / b
,如果 0
是 b
,则返回 0
,如果 {{1} 中至少有一个,则返回 nan
}} 或 a
是 b
,适用于标量和数组输入,即,
nan
import numpy as np
def div(a, b):
out = a / b
# out[b == 0] = 0 TypeError: 'float' object does not support item assignment
# out = np.nan_to_num(out, nan=0.0)
return out
assert div(2, 1) == 2
assert np.all(div(np.array([2, 2]), np.array([1, 1])) == np.array([2, 2]))
assert np.isnan(div(np.nan, np.nan))
assert div(np.array(0), np.array(0)) == 0
几乎可以解决问题,但我很想控制条件(np.nan_to_num
对 b == 0
)。
答案 0 :(得分:5)
使用 np.where
怎么样?
np.where(b==0, 0, a/b)
这假设您的输入是 numpy 数组,但您可以在此之前轻松处理转换。
答案 1 :(得分:2)
import numpy as np
def div(a, b):
if(not isinstance(a, np.ndarray)):
return a*b and a/b
else:
a[b==0] = 0
b[b==0] = 1
return a/b
assert div(2, 1) == 2
assert np.all(div(np.array([2, 2]), np.array([1, 1])) == np.array([2, 2]))
assert np.isnan(div(np.nan, np.nan))
assert div(np.array(0), np.array(0)) == 0
答案 2 :(得分:1)
只计算 b 不为 0 的时隙。
这当然假设 [如问题中所述] 输入是数组而不是标量
def div(a, b):
out = np.zeros_like(a)
out[b != 0] = a[b != 0] / b[b != 0]
return out
要支持标量值,请将 a, b, = np.array(a), np.array(b)
添加为第一行。
答案 3 :(得分:-1)
如果不考虑性能,您可以使用 vectorize
。
正如@chepner 已经指出的那样,nan
案例已经由 /
处理。所以你只需要检查是否 b == 0
.
@np.vectorize
def div(a, b):
return 0 if b == 0 else a / b