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