从Python中的NaN(或其他值)的numpy数组中删除元素对

11 python arrays numpy scipy

我有一个在numpy中有两列的数组.例如:

a = array([[1, 5, nan, 6],
           [10, 6, 6, nan]])
a = transpose(a)
Run Code Online (Sandbox Code Playgroud)

我想有效地遍历两列,一个[:,0]和一个[:,1]并删除满足某个条件的任何对,在这种情况下,如果它们是NaN.我能想到的显而易见的方法是:

new_a = []
for val1, val2 in a:
  if val2 == nan or val2 == nan:
    new_a.append([val1, val2])
Run Code Online (Sandbox Code Playgroud)

但这似乎很笨拙.什么是pythonic numpy方式这样做?

谢谢.

kra*_*oti 31

如果您只想获取没有NAN的行,那么这就是您需要的表达式:

>>> import numpy as np
>>> a[~np.isnan(a).any(1)]
array([[  1.,  10.],
       [  5.,   6.]])
Run Code Online (Sandbox Code Playgroud)

如果您希望其元素中没有特定数字的行,例如5:

>>> a[~(a == 5).any(1)]
array([[  1.,  10.],
       [ NaN,   6.],
       [  6.,  NaN]])
Run Code Online (Sandbox Code Playgroud)

后者显然相当于

>>> a[(a != 5).all(1)]
array([[  1.,  10.],
       [ NaN,   6.],
       [  6.,  NaN]])
Run Code Online (Sandbox Code Playgroud)

说明:让我们首先创建您的示例输入

>>> import numpy as np
>>> a = np.array([[1, 5, np.nan, 6],
...               [10, 6, 6, np.nan]]).transpose()
>>> a
array([[  1.,  10.],
       [  5.,   6.],
       [ NaN,   6.],
       [  6.,  NaN]])
Run Code Online (Sandbox Code Playgroud)

这确定了哪些元素是NAN

>>> np.isnan(a)
array([[False, False],
       [False, False],
       [ True, False],
       [False,  True]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

这标识哪些行具有任何True的元素

>>> np.isnan(a).any(1)
array([False, False,  True,  True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

既然我们不想要这些,我们否定最后一个表达式:

>>> ~np.isnan(a).any(1)
array([ True,  True, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

最后我们使用布尔数组来选择我们想要的行:

>>> a[~np.isnan(a).any(1)]
array([[  1.,  10.],
       [  5.,   6.]])
Run Code Online (Sandbox Code Playgroud)

  • +1:超级清晰且有用的解释,我喜欢~np.isnan,因为它说明了你在做什么. (2认同)