删除两个相同长度数组中的nan AND对应元素

时间:2016-05-31 08:38:07

标签: python arrays python-3.x numpy

我有两个相同长度的列表,我可以将其转换为数组以使用numpy.stats.pearsonr方法。现在,这些列表的一些元素是nan,因此不能用于该方法。在我的情况下,最好的办法是删除这些元素,以及另一个列表中的相应元素。是否有实用和pythonic的方式来做到这一点? 示例:我有

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

最后我需要

[1 5 6 ]

[1 5 6 ]

(这里的数字代表位置/指数,而不是我正在处理的实际数字)。编辑:这里棘手的部分是在一个数组中没有nan s的列表/数组和在另一个数组中对应nan s的元素,反之亦然。虽然它当然可以通过操作数组来完成,但我确信有一种清晰且不复杂的方式以pythonic方式进行。

1 个答案:

答案 0 :(得分:5)

建议复制的接受答案会让你在那里中途。既然您已经在使用Numpy,那么您应该将它们变成numpy数组。然后你应该生成一个索引表达式,然后用它来索引这两个数组。这里索引将是具有相同形状的bool的新数组,其中每个元素为True iff not(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))