首页 > 解决方案 > Python:是否有一个 NumPy 函数在掩码为真时从一个数组中获取,而在掩码为假时从另一个数组中获取?

问题描述

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

我研究了布尔屏蔽,但这需要多行,因为我必须屏蔽denominators才能不出现任何除零错误,以及将这些元素设置为零的结果。

我可以发誓我见过这样的功能,但我再也找不到了。

标签: pythonarraysnumpy

解决方案


您有多种选择:

  1. 从 numpy 版本 1.7开始, Ufunc 之类np.divide的支持掩码: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]
    

    或者

    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),但此时掩码更有效。


推荐阅读