0

我有两个 NumPy 数组,比如 num 和 denom。我需要根据各个元素是否为零以num和denom返回特定值,

        r2 = []
        for denind, denel in enumerate(denom):
            numel = num[denind]
            if denel:  # Denominator is not zero
                r2.append(1 - numel/denom)
            elif numel:  # Denominator is zero, but numerator is not zero
                r2.append(0.0)
            else:  # Both denominator and numerator are zero.
                r2.append(1.0)
        return np.array(r2)

是否有一种“NumPy”方式来进行这样的迭代。

4

3 回答 3

2

是的,您可以使用布尔数组作为索引来修复除法后的数组。您可以使用isinf(a)andisnan(a)来获取所需的布尔数组进行索引a

with numpy.errstate(divide='ignore'):
    res = 1.0 - num/double(den);
res[isinf(res)] = 0.0;   # zero denominator will give +- infinity
res[isnan(res)] = 1.0;   # both zero will give nan

这里的神奇之处在于布尔数组索引返回一个视图,该视图res仅选择布尔值所在的那些元素True。如果您从该选择中读取,您会看到一个平面数组,但如果您写入它(如上),那么它会修改原始数组。

另外,我明确地den转换为,double因为如果两个操作数都是整数,那会很恐怖。

更新:看来你应该 cast den,如果你投num它仍然可以工作,但你会收到一个警告。最安全的事情是同时施放。

于 2013-10-09T14:03:47.947 回答
1

您可以使用嵌套的 np.where 语句

numpy.where(denom !=0, 1 - numel/denom, np.where(numel != 0, 0, 1))
于 2013-10-09T15:04:46.900 回答
1

做最少的除法工作怎么样?

r2 = np.ones_like(numel, dtype=float)
num_mask = (numel != 0)
den_mask = (denel != 0)
mask = num_mask & den_mask
r2[mask] = 1 - numel[mask]/denel[mask]
mask = ~den_mask & num_mask
r2[mask] = 0
于 2013-10-09T14:51:23.503 回答