2013-12-19 56 views
1

目前我使用下面的方法成功忽略一個變量忽略多個變量與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() 
+0

說'我無法讓它工作'幾乎和提供錯誤信息一樣糟糕,卻沒有注意到哪一行觸發了它。如果沒有錯誤信息,說明結果有什麼問題。 – hpaulj

回答

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',因爲('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',對不對?


你想要一個這裏,不是。所以:

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

神奇的解釋,非常詳細的迴應。 (噗:你錯過了最後兩個'0.00'值的單引號) – Ryflex

+0

@Hyflex:感謝您接受錯別字! – abarnert

2

嘗試:

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

你確定嗎?你正在主持,因爲你的回答並非隱含正確,也沒有任何解釋 –

+0

如果我理解這個問題,這個_does_回答它。然而,它真的應該解釋它是什麼,如果這對每個人都不明顯...... – abarnert

+0

它100%解決了我的問題,因此我將其作爲答案推向市場。 – Ryflex

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