我有两个相同长度的列表,我可以将其转换为数组以使用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方式进行。
答案 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_or
:indices = ~(np.isnan(x) | np.isnan(y))