目前我正在使用以下内容成功忽略单个变量
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()
答案 0 :(得分:3)
首先,让我们来看看你做错了什么:
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') or '0.00'
或nValues != ('NA' or '0.00')
相同。尝试在命令行解释器中键入这两个表达式,以查看它们各自执行的操作。一个给你一个ValueError
,因为你试图用or
0.00
掩码数组,另一个成功掩盖'NA'
,忽略'0.00'
,因为{{ 1}}与('NA' or '0.00')
相同。这两者都不是你想要的。
要明白这一点,你需要这样做:
'NA'
然而,这仍然不起作用。再次,你得到一个mask = (nValues != 'NA') or (nValues != '0.00')
,这次是因为你试图ValueError
两个数组。错误描述“具有多个元素的数组的真值是不明确的”会告诉您出错的原因:or
总是希望将其操作数视为真值。如果它是真的,它返回第一个值,否则返回第二个值。你不能将它用于元素or
两个数组。
为此,您需要or
运算符。所以:
|
现在它有点像“有效”......但它没有做正确的事情。你得到一个掩码数组,但它是mask = (nValues != 'NA') | (nValues != '0.00')
!
为什么呢?那么,你可以想象的每一个价值要么不是[True, True, True]
,要么不是'NA'
,对吧?
你想要一个和,而不是或。所以:
'0.00'
答案 1 :(得分:2)
尝试:
mask = (nValues != 'NA') & (nValues != '0.00')
答案 2 :(得分:1)
您可以使用np.in1d()
来测试要排除的任意数量的值:
vars = np.random.random_integers(0, 10, 20).astype('|S8')
print vars
# ['8' '0' '2' '1' '2' '3' '1' '1' '0' '9' '8' '6' '10' '0' '9' '9' '3' '9'
# '6' '1']
exclude = np.array([1, 2, 3, 5, 7], dtype='|S8')
mask = ~np.in1d(vars, exclude)
print vars[mask]
# ['8' '0' '0' '9' '8' '6' '10' '0' '9' '9' '9' '6']
print vars[~mask]
# ['2' '1' '2' '3' '1' '1' '3' '1']