我以numpy.ndarray的形式读入数据集,但其中一些值丢失了(可能是因为不存在,可能是NaN,也可能是字符串“NA“)。我想清除所有包含类似条目的行。如何使用numpy ndarray来实现这一点?
numpy.ndarray
NaN
NA
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的类似数组,其中NaN,False在别处。.any(axis=1)通过对整个行的逻辑or操作将m*n数组减少到n,~反转True/False并且a[ ]仅从原始数组中选择行,其在括号内具有True。
a
np.isnan(a)
True
False
.any(axis=1)
or
m*n
n
~
True/False
a[ ]
bmp9r5qi2#
您还可以通过np.ma.fix_invalid使用掩码数组来创建掩码并过滤掉“坏”值(如NaN、inf)。
np.ma.fix_invalid
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可用于“屏蔽”这些值,然后将其过滤掉。
'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. ]])
2条答案
按热度按时间mm5n2pyu1#
并将其重新分配给
a
。说明:
np.isnan(a)
返回具有True
的类似数组,其中NaN
,False
在别处。.any(axis=1)
通过对整个行的逻辑or
操作将m*n
数组减少到n
,~
反转True/False
并且a[ ]
仅从原始数组中选择行,其在括号内具有True
。bmp9r5qi2#
您还可以通过
np.ma.fix_invalid
使用掩码数组来创建掩码并过滤掉“坏”值(如NaN、inf)。如果数组包含诸如
'NA'
之类的字符串,则np.where
可用于“屏蔽”这些值,然后将其过滤掉。