我在数据集中读取为numpy.ndarray
并且缺少一些值(要么是不在那里,要么是NaN
,要么是写成"NA
"的字符串(。
我想清除包含此类任何条目的所有行。 我如何使用 numpy ndarray 做到这一点?
>>> a = np.array([[1,2,3], [4,5,np.nan], [7,8,9]])
array([[ 1., 2., 3.],
[ 4., 5., nan],
[ 7., 8., 9.]])
>>> a[~np.isnan(a).any(axis=1)]
array([[ 1., 2., 3.],
[ 7., 8., 9.]])
并将其重新分配给a
.
说明:np.isnan(a)
返回一个类似的数组,其中True
NaN
,False
其他地方。 .any(axis=1)
m*n
数组简化为对整行进行逻辑or
操作n
,~
反转True/False
,a[ ]
仅选择原始数组中的行,这些行True
在括号内。
通过np.ma.fix_invalid
使用屏蔽数组来创建掩码并过滤掉"错误"值(例如NaN,inf(。
arr = np.array([
[0, 1, np.inf],
[2.2, 3.3, 4.],
[np.nan, 5.5, 6],
[7.8, -np.inf, 9.9],
[10, 11, 12]
])
new_arr = arr[~np.ma.fix_invalid(arr).mask.any(axis=1)]
# array([[ 2.2, 3.3, 4. ],
# [10. , 11. , 12. ]])
如果数组包含诸如 'NA'
之类的字符串,那么np.where
"屏蔽"这些值然后过滤掉它们可能很有用。
arr = np.array([
[0, 1, 'N/A'],
[2.2, 3.3, 4.],
[np.nan, 5.5, 6],
[7.8, 'NA', 9.9],
[10, 11, 12]
], dtype=object)
tmp = np.where(np.isin(arr, ['NA', 'N/A']), np.nan, arr).astype(float)
new_arr = tmp[~np.isnan(tmp).any(axis=1)]
# array([[ 2.2, 3.3, 4. ],
# [10. , 11. , 12. ]])