Skip to main content
 首页 » 编程设计

python之使用 numpy 忽略多个变量(包括函数)

2025年05月04日20haluo1

目前我正在使用以下方法成功忽略单个变量

nValues = np.asarray(values, dtype="|S8") 
mask = nValues != 'NA' 

但是,我试图忽略多个变量,所以我尝试了:

nValues = np.asarray(values, dtype="|S8") 
mask = nValues != 'NA' 
mask = nValues != '0.00' 

和

nValues = np.asarray(values, dtype="|S8") 
mask = nValues != 'NA' or '0.00' 

和

nValues = np.asarray(values, dtype="|S8") 
mask = nValues != 'NA' 
mask = nValues[mask] != '0.00' 

不幸的是我无法让它工作,有什么想法吗?

完整的函数是:

def mapValues(values): 
    nValues = np.asarray(values, dtype="|S8") 
    mask = nValues != 'CFNA' 
    maskedValues = [float(i.split('%')[0]) for i in nValues[mask]] 
    colorMap = np.array(['#F8696B', '#F86E6C', '#F8736D', '#F8786E', '#F97E6F', '#F98370', '#F98871', '#FA8E72', '#FA9373', '#FA9874', '#FA9E75', '#FBA376', '#FBA877', '#FBAD78', '#FCB379', '#FCB87A', '#FCBD7B', '#FCC37C', '#FDC87D', '#FDCD7E', '#FDD37F', '#FED880', '#FEDD81', '#FEE382', '#FEE883', '#FCEB84', '#F6E984', '#F0E784', '#E9E583', '#E3E383', '#DCE182', '#D6E082', '#D0DE82', '#C9DC81', '#C3DA81', '#BDD881', '#B6D680', '#B0D580', '#AAD380', '#A3D17F', '#9DCF7F', '#96CD7E', '#90CB7E', '#8ACA7E', '#83C87D', '#7DC67D', '#77C47D', '#70C27C', '#6AC07C', '#63BE7B']) 
    _, bins = np.histogram(maskedValues, 49) 
    mapped = np.digitize(maskedValues, bins) 
    nValues[mask] = colorMap[mapped - 1] 
    nValues[~mask] = "#808080" 
    return nValues.tolist() 

请您参考如下方法:

首先,让我们看看你做错了什么:

mask = nValues != 'NA' 
mask = nValues != '0.00' 

在每个版本之后打印出 mask 真的很有帮助,看看它是否合理。给定 values = ['NA', '0.00', '1.11'],您显然想要得到 [False, False, True]。你得到了什么?

array([True, False, True]) 

为什么?好吧,您刚刚将 mask 分配给一个掩码数组,然后立即忘记了这一点并将 mask 重新分配给了一个不同的掩码数组。这不可能做任何有用的事情,或者与第二行本身不同的任何事情。事实上,对于所有不是 '0.00' 的元素,无论它们是否是 'NA',您都会得到一个掩码数组。


接下来,你试试这个:

mask = nValues != 'NA' or '0.00' 

这并没有达到您想要的效果,而且很难想象它是如何做到的。无论您期望优先级在 Python 中如何工作,这最终都必须与 (nValues != 'NA') 或 '0.00' 或 nValues != (' NA' 或 '0.00')。尝试将这两个表达式输入命令行解释器,看看它们各自做了什么。一个给你一个 ValueError 因为你正试图或一个带有 0.00 的掩码数组,另一个成功地掩码 'NA',忽略 '0.00',因为 ('NA' or '0.00') 与 'NA' 相同。两者都不是您想要的。


为了让它变得合理,你需要这样做:

mask = (nValues != 'NA') or (nValues != '0.00') 

但是,还是不行。同样,您会得到一个 ValueError,这次是因为您正试图将两个数组或在一起。错误描述“具有多个元素的数组的真值不明确”告诉您出了什么问题:或总是想将其操作数视为真值。如果为真,则返回第一个值,否则返回第二个值。您不能将它用于按元素 或 将两个数组组合在一起。


为此,您需要 | 运算符。所以:

mask = (nValues != 'NA') | (nValues != '0.00') 

现在它有点“有效”……但它没有做正确的事情。你得到一个掩码数组,但它是 [True, True, True]!

为什么?那么,您可能想象的每个值要么不是 'NA',要么不是 '0.00',对吗?


你想要的是and,而不是or。所以:

mask = (nValues != 'NA') & (nValues != '0.00')