2016-05-31 27 views
2

我有兩個相同長度的列表,我可以將它們轉換爲數組以便與numpy.stats.pearsonr方法一起玩。現在,這些列表中的一些元素是nan,因此不能用於該方法。在我的情況下,最好的辦法是刪除這些元素,以及另一個列表中的相應元素。有沒有一種實際的pythonic方法來做到這一點? 例如:我有在兩個相同長度的數組中刪除nan AND對應的元素

[1 2 nan 4 5 6 ][1 nan 3 nan 5 6]

和到底我需要

[1 5 6 ]

[1 5 6 ]

(這裏的數量是代表性的位置/指數的,而不是我正在處理的實際數字)。編輯:這裏棘手的部分是在一個數組中有兩個不帶nan的列表/數組,另一個對應於nan s的元素,反之亦然。雖然它當然可以通過操作數組來完成,但我確信有一種明確的而不是過度複雜的方式來以pythonic的方式來完成它。

回答

5

被提議的重複的接受答案讓你在那裏一半。既然你已經使用了Numpy,你應該將它們變成numpy數組。然後你應該生成一個索引表達式,然後用它來索引這兩個數組。這裏指數將是相同的形狀的bool一個新的數組,其中每個元素是True當且僅當沒有(在X相應的元件是nan或在y中相應的元件是nan):

>>> x 
array([ 1., 2., nan, 4., 5., 6.]) 
>>> y 
array([ 1., nan, 3., nan, 5., 6.]) 
>>> indices = np.logical_not(np.logical_or(np.isnan(x), np.isnan(y))) 
>>> x = x[indices] 
>>> y = y[indices] 
>>> x 
array([ 1., 5., 6.]) 
>>> y 
array([ 1., 5., 6.]) 

值得注意的是,這適用於任何2個陣列形狀相同。

PS,如果你知道,在操作數數組元素爲布爾類型,如數組從isnan這裏返回的情況下,你可以使用~代替logical_not|代替logical_orindices = ~(np.isnan(x) | np.isnan(y))

+1

我想推薦的方法是使用numpy的布爾運算符:'numpy.logical_not'和'numpy.logical_and'以及'numpy.isnan'。 – Bort

+0

清晰,簡單,很好的解釋。它的工作原理。謝謝! –

+0

@Bort也許,但'isnan'已經返回布爾值,所以'〜'和'|'也可以。 –