从数组中删除 nan 值

从数组中删除 nan 值

已邀请:
(1)删除所有的缺失值(NaN)
通过使用取反运算符〜在此ndarray中将缺失值NaN的位置设置为False,可以删除缺失值(提取不缺失值的元素),但由于剩余元素的数量不同,因此可以删除原始数组ndarray的形状不会保留,而是被展平。

print(~np.isnan(a))
# [[ True True False True]
# [ True False False True]
# [ True True True True]]

print(a[~np.isnan(a)])
# [11. 12. 14. 21. 24. 31. 32. 33. 34.]

(2)删除包含缺失值(NaN)的行
要删除包含缺失值NaN的行,可以使用any()方法,如果NumPy数组行中有一个缺失值则整行返回True。
如果参axis= 1,则确定每一行是否有缺失值。

print(np.isnan(a).any(axis=1))
# [ True True False]

使用取反运算符〜将没有缺失值的行设置为True。

print(~np.isnan(a).any(axis=1))
# [False False True]

删除包含缺失值的行。

print(a[~np.isnan(a).any(axis=1), :])
# [[31. 32. 33. 34.]]

print(a[~np.isnan(a).any(axis=1)])
# [[31. 32. 33. 34.]]

(3)删除包含缺失值(NaN)的列
删除包含缺失值NaN的列时也是如此。 如果在any()中参数axis= 0,则确定每一列是否至少有一个True。使用取反运算符〜将没有任何缺失值的列设置为True。

print(~np.isnan(a).any(axis=0))
# [ True False False True]

删除包含缺失值的列。

print(a[:, ~np.isnan(a).any(axis=0)])
# [[11. 14.]
# [21. 24.]
# [31. 34.]]

如果只想删除缺少值的列,请使用all()而不是any()。

a = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
a[2, 2] = np.nan
print(a)
# [[11. 12. nan 14.]
# [21. nan nan 24.]
# [31. 32. nan 34.]]

print(a[:, ~np.isnan(a).any(axis=0)])
# [[11. 14.]
# [21. 24.]
# [31. 34.]]

print(a[:, ~np.isnan(a).all(axis=0)])
# [[11. 12. 14.]
# [21. nan 24.]
# [31. 32. 34.]]

要回复问题请先登录注册