a / b,但如果 b == 0 则返回 0

时间:2021-02-21 15:33:05

标签: python numpy nan

我想要一个除法方法,它返回 a / b,如果 0b,则返回 0,如果 {{1} 中至少有一个,则返回 nan }} 或 ab,适用于标量和数组输入,即,

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_numb == 0)。

4 个答案:

答案 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
相关问题