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

4
我有两个长度相同的列表,可以将它们转换为数组,以使用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的方式完成它。

1个回答

7

对于提出的重复问题的接受答案可以让您走了一半的路。既然您已经在使用Numpy,那么您应该将它们转换为Numpy数组。然后,您应该生成一个索引表达式,然后使用它来索引这两个数组。这里的indices将是一个新的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个数组。

附注:如果您知道操作数数组中的元素类型为布尔值,就像在此处从isnan返回的数组一样,您可以使用~代替logical_not以及使用|代替logical_orindices = ~(np.isnan(x) | np.isnan(y))


1
我认为推荐的方法是使用numpy的布尔运算符:numpy.logical_notnumpy.logical_and,以及numpy.isnan - Bort
清晰易懂,讲解详细。而且它还能正常工作。谢谢! - Py-ser
@Bort 或许是这样,但 isnan 已经返回布尔值了,所以 ~| 同样适用。 - Antti Haapala -- Слава Україні
@AnttiHaapala,由于许多Matlab用户认为 ~ | 是逻辑运算符,但在numpy中它们是位运算符,这是常见的混淆错误来源。这就是为什么我添加了我的评论并赞同您的解决方案的原因。 - Bort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接