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

ttp71kqs  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(209)

我以numpy.ndarray的形式读入数据集,但其中一些值丢失了(可能是因为不存在,可能是NaN,也可能是字符串“NA“)。
我想清除所有包含类似条目的行。如何使用numpy ndarray来实现这一点?

mm5n2pyu

mm5n2pyu1#

>>> 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)通过对整个行的逻辑or操作将m*n数组减少到n~反转True/False并且a[ ]仅从原始数组中选择行,其在括号内具有True

bmp9r5qi

bmp9r5qi2#

您还可以通过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. ]])

相关问题