【问题标题】:Delete nan AND corresponding elements in two same-length array删除两个相同长度数组中的 nan AND 对应元素
【发布时间】:2016-05-31 08:38:07
【问题描述】:

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

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

最后我需要

[1 5 6 ]

[1 5 6 ]

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

【问题讨论】:

    标签: python arrays python-3.x numpy


    【解决方案1】:

    对提议的重复项的接受答案让您成功了一半。由于您已经在使用 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 个相同形状的数组。

    indices = ~(np.isnan(x) | np.isnan(y))

    【讨论】:

    • 我认为推荐的方式是使用numpy的布尔运算符:numpy.logical_notnumpy.logical_and以及numpy.isnan
    • 清晰、简单且解释清楚。它有效。谢谢!
    • @Bort 也许是,但isnan 已经返回布尔值,所以~| 也可以工作。
    • @AnttiHaapala 自从很多matlab人想到了~ |作为逻辑运算符,但它们在 numpy 中是按位运算符,因此经常会导致混淆错误。这就是我添加评论并支持您的解决方案的原因。
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多