Numpy基于两个不同数组返回值的方法

时间:2013-10-09 13:53:59

标签: python arrays numpy

我有两个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”方式进行此类迭代。

3 个答案:

答案 0 :(得分:2)

是的,您可以使用布尔数组作为索引来修复分割后的数组。您可以使用isinf(a)isnan(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,因为如果两个操作数都是整数,那就太恐怖了。

更新:您似乎应该投射den,如果您投射num它仍会有效,但您会收到警告。最安全的事情就是投两个。

答案 1 :(得分: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

答案 2 :(得分:1)

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

numpy.where(denom !=0, 1 - numel/denom, np.where(numel != 0, 0, 1))