【问题标题】:Removing NaNs in numpy arrays删除 numpy 数组中的 NaN
【发布时间】:2015-05-21 03:40:00
【问题描述】:

我有两个包含 NaN 的 numpy 数组:

A = np.array([np.nan,   2,   np.nan,   3,   4])
B = np.array([   1  ,   2,     3   ,   4,  np.nan])

是否有任何智能方法使用 numpy 删除两个数组中的 NaN,并删除另一个列表中相应索引上的内容? 让它看起来像这样:

A = array([  2,   3, ])
B = array([  2,   4, ])

【问题讨论】:

  • 你也在使用pandas吗? (dropna 可以用 DataFrame 对象做你想做的事)

标签: python arrays numpy nan


【解决方案1】:

您可以做的是将 2 个数组加在一起,这将用 NaN 值覆盖它们不存在的地方,然后使用它生成一个布尔掩码索引,然后使用该索引索引到您的原始 numpy 数组:

In [193]:

A = np.array([np.nan,   2,   np.nan,   3,   4])
B = np.array([   1  ,   2,     3   ,   4,  np.nan])
idx = np.where(~np.isnan(A+B))
idx
print(A[idx])
print(B[idx])
[ 2.  3.]
[ 2.  4.]

A+B的输出:

In [194]:

A+B
Out[194]:
array([ nan,   4.,  nan,   7.,  nan])

编辑

正如@Oliver W. 正确指出的那样,np.where 是不必要的,因为np.isnan 会生成一个布尔索引,您可以使用它来索引数组:

In [199]:

A = np.array([np.nan,   2,   np.nan,   3,   4])
B = np.array([   1  ,   2,     3   ,   4,  np.nan])
idx = (~np.isnan(A+B))
print(A[idx])
print(B[idx])
[ 2.  3.]
[ 2.  4.]

【讨论】:

  • 使用np.where 完全是多余的。
  • @OliverW。唔。是的,你是对的,我原本以为我需要整数索引,但是是的,这里没有必要,我会更新我的答案
【解决方案2】:

A[~(np.isnan(A) | np.isnan(B))]

B[~(np.isnan(A) | np.isnan(B))]

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 2016-08-15
    • 2019-12-22
    • 2015-06-08
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多