要从给定的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=1
和axis=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元素的那一列。