将nan值转换为零

Cur*_*arn 66 python numpy nan

我有一个2D numpy数组.这个数组中的一些值是NaN.我想使用这个数组执行某些操作.例如,考虑数组:

[[   0.   43.   67.    0.   38.]
 [ 100.   86.   96.  100.   94.]
 [  76.   79.   83.   89.   56.]
 [  88.   NaN   67.   89.   81.]
 [  94.   79.   67.   89.   69.]
 [  88.   79.   58.   72.   63.]
 [  76.   79.   71.   67.   56.]
 [  71.   71.   NaN   56.  100.]]
Run Code Online (Sandbox Code Playgroud)

我试图逐行取一行,按相反顺序对其进行排序,以从行中获取最多3个值并取其平均值.我试过的代码是:

# nparr is a 2D numpy array
for entry in nparr:
    sortedentry = sorted(entry, reverse=True)
    highest_3_values = sortedentry[:3]
    avg_highest_3 = float(sum(highest_3_values)) / 3
Run Code Online (Sandbox Code Playgroud)

这不适用于包含的行NaN.我的问题是,是否有一种快速方法可以NaN在2D numpy数组中将所有值转换为零,这样我就可以排序和其他我想做的事情.

Pau*_*aul 114

A您的2D数组在哪里:

import numpy as np
A[np.isnan(A)] = 0
Run Code Online (Sandbox Code Playgroud)

该函数isnan生成一个bool数组,指示NaN值的位置.布尔数组可用于索引相同形状的数组.把它想象成一个面具.


Mar*_*cin 97

这应该工作:

from numpy import *

a = array([[1, 2, 3], [0, 3, NaN]])
where_are_NaNs = isnan(a)
a[where_are_NaNs] = 0
Run Code Online (Sandbox Code Playgroud)

在上述情况中,where_N_NaNs是:

In [12]: where_are_NaNs
Out[12]: 
array([[False, False, False],
       [False, False,  True]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)


Dra*_*uan 28

如何nan_to_num()

  • nan_to_num()也会改变无穷大 - 在某些情况下这可能是不需要的. (11认同)
  • 它也比其他方法慢10倍. (7认同)
  • 我不确定"10x慢"声明,所以我查了一下.实际上,它要慢得多.感谢您指出了这一点. (4认同)

ser*_*inc 9

德雷克使用答案的代码示例nan_to_num:

>>> import numpy as np
>>> A = np.array([[1, 2, 3], [0, 3, np.NaN]])
>>> A = np.nan_to_num(A)
>>> A
array([[ 1.,  2.,  3.],
       [ 0.,  3.,  0.]])
Run Code Online (Sandbox Code Playgroud)


Ant*_*pov 6

您可以np.where用来查找您的位置NaN

import numpy as np

a = np.array([[   0,   43,   67,    0,   38],
              [ 100,   86,   96,  100,   94],
              [  76,   79,   83,   89,   56],
              [  88,   np.nan,   67,   89,   81],
              [  94,   79,   67,   89,   69],
              [  88,   79,   58,   72,   63],
              [  76,   79,   71,   67,   56],
              [  71,   71,   np.nan,   56,  100]])

b = np.where(np.isnan(a), 0, a)

In [20]: b
Out[20]: 
array([[   0.,   43.,   67.,    0.,   38.],
       [ 100.,   86.,   96.,  100.,   94.],
       [  76.,   79.,   83.,   89.,   56.],
       [  88.,    0.,   67.,   89.,   81.],
       [  94.,   79.,   67.,   89.,   69.],
       [  88.,   79.,   58.,   72.,   63.],
       [  76.,   79.,   71.,   67.,   56.],
       [  71.,   71.,    0.,   56.,  100.]])
Run Code Online (Sandbox Code Playgroud)

  • 事实上,它不起作用,您需要将 `np.where(np.isnan(a), a, 0)` 更改为 `np.where(~np.isnan(a), a, 0)`。不过,这可能是所使用版本的差异。 (3认同)
  • @TehTris 你是对的,谢谢。我将其更改为“b = np.where(np.isnan(a), 0, a)”,这比我认为的“~”更简单。 (3认同)