我有两个相同长度的列表,我可以将它们转换成数组来使用 numpy.stats.pearsonr方法。现在,这些列表中的一些元素是 nan
,因此不能用于该方法。在我的例子中,最好的办法是删除那些元素,以及另一个列表中的相应元素。有没有一种实用且pythonic的方法来做到这一点?
示例:我有
[1 2 nan 4 5 6 ]
和 [1 nan 3 nan 5 6]
最后我需要
[1 5 6 ]
[1 5 6 ]
(这里的数字代表位置/指数,而不是我正在处理的实际数字)。编辑:这里棘手的部分是在一个数组中同时包含没有 nan
的列表/数组,在另一个数组中包含对应于 nan
的元素,反之亦然。虽然它肯定可以通过操纵数组来完成,但我相信有一种清晰且不过分复杂的方法可以用 Pythonic 方式来完成。
最佳答案
已接受的建议重复答案让您完成了一半。由于您已经在使用 Numpy,因此您应该将它们制作成 numpy 数组。然后你应该生成一个索引表达式,然后用它来索引这两个数组。这里的索引将是一个新的 bool
数组,形状相同,其中每个元素都是 True
iff 不是(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 个相同形状的阵列。
P.S.,如果你知道操作数数组中的元素类型是 bool 值,就像这里从 isnan
返回的数组一样,你可以使用 ~
而不是logical_not
和 |
而不是 logical_or
:indices = ~(np.isnan(x) | np.isnan(y))
关于python - 删除两个等长数组中nan AND对应的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37540782/