2017-08-16 82 views
3

我有一些NaN值的numpy的數組:甲屏蔽數組索引問題

arr = [ 0, NaN, 2, NaN, NaN, 5, 6, 7 ] 

使用一些邏輯(問題範圍之外),I生成的NaN位置的掩模:

mask = [ True, False, True, False, False, True, True, True ] 

我用這個面具只選擇有效的數據:

valid_arr = arr[mask] # [ 0, 2, 5, 6, 7 ] 

我然後執行任意algorith米,在這種新的數組選擇幾個indeces

indeces = myAlgo(valid_arr) # [ 1, 3 ] 

所述有效陣列中的indeces是1,3-(對應於值2和6)。我需要知道在原始數組(arr)中這些對應的indeces這些對應於。在上面的例子中,這顯然是2和6

該數組是時間序列數據,未排序。一種解決方案是遍歷mask,只有在找到有效數字時才遞增計數器。這可以使用numpy更有效地完成嗎?

回答

3

可以平從原始陣列返回的索引,然後使用新的索引到子集掩模指數掩模:

mask = np.array([ True, False, True, False, False, True, True, True ]) 
indices = [1,3] 

np.flatnonzero(mask)[indices] 
# array([2, 6]) 
+0

我對這是如何工作有點困惑。基於numpy文檔,'flatnonzero(a)返回扁平版本a中非零的索引。我認爲這也適用於True/False遮罩陣列? –

+1

它的確如此。在這裏,「True」被視爲1並且「False」被視爲0,就像大多數情況下隱式類型轉換髮生時一樣。 – Psidom

+1

啊,我明白了......它包含了與原始數組對應的indeces!優秀! –