如何从一个给定的NumPy数组中移除NaN值

  • Post category:Python

要从给定的NumPy数组中移除NaN值,可以通过使用NumPy提供的函数numpy.isnan(),然后通过布尔索引的方式过滤掉NaN值所在的行或列。

下面是完整的攻略:

步骤一:导入NumPy模块

import numpy as np

步骤二:创建NumPy数组

可以使用NumPy中的随机数函数来创建一个包含NaN值的NumPy数组:

arr = np.random.rand(5, 5)
arr[2, 2] = np.nan

上述代码会创建一个5×5的数组,并将第三行第三列的元素设为NaN。

步骤三:过滤NaN值

可以使用numpy.isnan()函数来判断一个元素是否为NaN:

mask = np.isnan(arr)

上述代码会创建一个布尔数组,其中元素为True表示对应的元素是NaN,否则为False。

要过滤掉所有含NaN元素所在的行或列,可以使用numpy.any()函数来筛选:

# 去除含有NaN元素所在的行
arr = arr[~np.any(mask, axis=1)]

# 去除含有NaN元素所在的列
arr = arr[:, ~np.any(mask, axis=0)]

注意到这里使用了numpy.any()函数的参数axis=1axis=0,分别表示行和列的方向。

示例说明一

下面是一个完整示例:

import numpy as np

arr = np.random.rand(5, 5)
arr[2, 2] = np.nan

mask = np.isnan(arr)

# 去除含有NaN元素所在的行
arr_filtered = arr[~np.any(mask, axis=1)]

print(arr)
print(arr_filtered)

运行结果为:

[[0.18897737 0.54375142 0.28530534 0.46229226 0.9508031 ]
 [0.34274691 0.70595848 0.05885084 0.9740593  0.1528797 ]
 [0.79436316 0.51662219        nan 0.96559866 0.28186241]
 [0.26082941 0.1725553  0.57949457 0.77018917 0.55519744]
 [0.2573359  0.03434873 0.97577811 0.33379289 0.25501849]]
[[0.18897737 0.54375142 0.28530534 0.46229226 0.9508031 ]
 [0.34274691 0.70595848 0.05885084 0.9740593  0.1528797 ]
 [0.26082941 0.1725553  0.57949457 0.77018917 0.55519744]
 [0.2573359  0.03434873 0.97577811 0.33379289 0.25501849]]

可以看到,原始数组中含有NaN值,而过滤后的数组中已经去除了含有NaN元素的那一行。

示例说明二

下面是另一个示例,这次过滤掉含有NaN值的列:

import numpy as np

arr = np.random.rand(5, 5)
arr[:, 2] = np.nan

mask = np.isnan(arr)

# 去除含有NaN元素所在的列
arr_filtered = arr[:, ~np.any(mask, axis=0)]

print(arr)
print(arr_filtered)

运行结果为:

[[0.78147017 0.72848203        nan 0.60422347 0.61943145]
 [0.60288306 0.75608617        nan 0.84314931 0.64100642]
 [0.79025225 0.23020521        nan 0.7298753  0.5589597 ]
 [0.91065579 0.73938049        nan 0.83527411 0.30315349]
 [0.41540718 0.15175015        nan 0.16230199 0.46233826]]
[[0.78147017 0.72848203 0.60422347 0.61943145]
 [0.60288306 0.75608617 0.84314931 0.64100642]
 [0.79025225 0.23020521 0.7298753  0.5589597 ]
 [0.91065579 0.73938049 0.83527411 0.30315349]
 [0.41540718 0.15175015 0.16230199 0.46233826]]

与上一个示例类似,原始数组中含有NaN值,而过滤掉含有NaN元素所在的列后,过滤后的数组中已经去除了含有NaN元素的那一列。