Python:是否有一个NumPy函数,当mask为true时从一个数组获取,而当mask为false时从另一个数组获取?

时间:2019-06-05 10:55:33

标签: python arrays numpy

我希望将数组numerators除以数组denominators,但是denominators中的某些元素可能为零。这些索引处的结果元素也应为零。 NumPy中是否有一个函数从numerators / denominators不为零的denominators中选择元素,否则从零数组中选择元素?

我研究了布尔掩码,但是这会花费多行,因为我必须掩码denominators才能得到除零错误以及设置结果的结果元素归零。

我可以发誓我已经看到过这样的功能,但现在找不到了。

3 个答案:

答案 0 :(得分:2)

您有多种选择:

  1. np.divide这样的功能从numpy版本1.7开始支持where掩码:

    quotients = np.divide(numerators, denominators, out=np.zeros(np.broadcast(numerators, denominators).shape, where=denominators != 0)
    
  2. 使用掩码数组:

    quotients = (numerators / np.ma.array(denominators, mask=denominators)).data
    

    这将屏蔽所有分母为零的元素,执行除法而不更改它们,并提取未屏蔽的数组。

  3. 手动使用遮罩。这将不止一行,但是您可以将其转换为将来使用的功能:

    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。不过,您仍然会获得所需的值。