我希望将数组numerators
除以数组denominators
,但是denominators
中的某些元素可能为零。这些索引处的结果元素也应为零。 NumPy中是否有一个函数从numerators / denominators
不为零的denominators
中选择元素,否则从零数组中选择元素?
我研究了布尔掩码,但是这会花费多行,因为我必须掩码denominators
才能得到除零错误以及设置结果的结果元素归零。
我可以发誓我已经看到过这样的功能,但现在找不到了。
答案 0 :(得分:2)
您有多种选择:
像np.divide
这样的功能从numpy版本1.7开始支持where
掩码:
quotients = np.divide(numerators, denominators, out=np.zeros(np.broadcast(numerators, denominators).shape, where=denominators != 0)
使用掩码数组:
quotients = (numerators / np.ma.array(denominators, mask=denominators)).data
这将屏蔽所有分母为零的元素,执行除法而不更改它们,并提取未屏蔽的数组。
手动使用遮罩。这将不止一行,但是您可以将其转换为将来使用的功能:
quotients = np.zeros(np.broadcast(numerators, denominators).shape)
mask = ~denominators
quotients[mask] = numerators[mask] / denominators[mask]
OR
quotients = np.empty(np.broadcast(numerators, denominators).shape)
mask = ~denominators
quotients[mask] = numerators[mask] / denominators[mask]
quotients[mask] = 0
在这种情况下无法使用np.where
。您最终像numerators / denominators
一样预先计算np.where(denominators, numerators / denominators, 0)
,这违背了整个目的。另外,您最终用np.where(denominators)
替换了遮罩,但是到那时,遮罩会更有效。
答案 1 :(得分:1)
看看np.divide
。您可以在where
参数的分母数组上使用条件,以对除法where=denominators!=0
施加条件。但是,这将保留第一个数组的值。
您可以一起省略where
参数,这会在分母为0的位置给出警告和0。
您还可以创建一个0数组(np.zeros(shape)
),并将其作为divide
方法应将其结果写入其中的数组。结合使用where
参数,这将给出正确的结果而不会发出警告。
答案 2 :(得分:0)
inds = np.where(denominators!=0)
ratio = np.zeros(numerators.shape)
ratio[inds] = nominators[inds]/denominators[inds]
或者,甚至更紧凑的版本:
np.where(denominators!=0,nominators/denominators,0)
第二种方法可以提供所需的内容,但会引发RuntimeWarning。不过,您仍然会获得所需的值。