如何删除 numpy.ndarray 中包含非数字值的所有行



我在数据集中读取为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 NaNFalse其他地方。 .any(axis=1) m*n数组简化为对整行进行逻辑or操作n~反转True/Falsea[ ]仅选择原始数组中的行,这些行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. ]])

最新更新