2010-10-04 70 views
6

我有一些代碼試圖在另一個指定的索引處查找數組的內容,這可能會指定超出前一個數組範圍的索引。在numpy中使用蒙版數組進行索引

input = np.arange(0, 5) 
indices = np.array([0, 1, 2, 99]) 

我想要做的是這樣的: 打印輸入[索引] 並獲得 [0 1 2]

但是這會產生一個異常(如預期):

IndexError: index 99 out of bounds 0<=index<5 

所以我想我可以使用蒙版陣列來隱藏超出範圍的索引:

indices = np.ma.masked_greater_equal(indices, 5) 

但還是:

>print input[indices] 
IndexError: index 99 out of bounds 0<=index<5 

即使:

>np.max(indices) 
2 

所以我不得不填補屏蔽數組第一,這是煩人的,因爲我不知道我可以用什麼填補值不選擇那些超出範圍的所有索引:

打印輸入[np.ma.filled(指數,0)]

[0 1 2 0] 

所以我的問題是:如何有效地使用numpy從數組中安全地選擇索引而不會越過輸入數組的邊界?

回答

5

不使用屏蔽數組,你可以刪除指數大於或等於5這樣的:

print input[indices[indices<5]] 

編輯:請注意,如果你也想拋棄負指數,你可以寫:

print input[indices[(0 <= indices) & (indices < 5)]] 
+0

D'oh的工作。我仍然很好奇爲什麼我們不能正確地使用掩碼數組進行索引,但我想這並不重要。 – Widjet 2010-10-04 23:50:30

3

這是一個非常糟糕的想法,用掩碼數組進行索引。有一個(很短)的時間使用MaskedArrays索引會引發異常,但它有點太苛刻...

在你的測試中,你正在過濾indices找到條件符合條件。你應該如何處理你的MaskedArray的缺失條目?條件是否爲假?真的嗎?你應該使用默認?用戶決定要做什麼取決於您。

使用indices.filled(0)意味着當indices的項目被屏蔽(如in,undefined)時,您希望將第一個索引(0)設置爲默認值。可能不是你想要的。

在這裏,我會簡單地使用input[indices.compressed()]compressed方法將您的MaskedArray平整,只保留未屏蔽的條目。

但是,當你意識到,你可能並不需要MaskedArrays在第一

+0

'壓縮'是我以後,謝謝。我曾假設用掩碼數組進行索引會首先有效地壓縮它們,這似乎是一個合理的默認值。但我想這可能需要分配一個新的數組,這將導致昂貴的默認值。 – Widjet 2013-01-02 21:02:22