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

时间:2013-12-19 00:24:36

标签: python python-2.7 numpy

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

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()

3 个答案:

答案 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']