2016-05-31 49 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'已经返回布尔值,所以'〜'和'|'也可以。 –

相关问题