从2D Numpy数组中删除NaN

时间:2018-07-13 00:40:57

标签: python numpy nan numpy-broadcasting

例如,如果我具有如下2D数组。

TableView

所需的结果是

[[1,2,3,NAN],
 [4,5,NAN,NAN],
 [6,NAN,NAN,NAN]
]

我应该如何转变?

我发现使用  [[1,2,3], [4,5], [6] ] 只能生成已压缩为一维数组的[1,2,3,4,5,6]。

谢谢!

1 个答案:

答案 0 :(得分:0)

只需逐行应用isnan

In [135]: [row[~np.isnan(row)] for row in arr]
Out[135]: [array([1., 2., 3.]), array([4., 5.]), array([6.])]

x[~numpy.isnan(x)]中的布尔蒙版会产生平坦的结果,因为通常,结果将像这样参差不齐,并且无法形成2d数组。


源数组必须是float dtype-因为np.nan是float:

In [138]: arr = np.array([[1,2,3,np.nan],[4,5,np.nan,np.nan],[6,np.nan,np.nan,np.nan]])
In [139]: arr
Out[139]: 
array([[ 1.,  2.,  3., nan],
       [ 4.,  5., nan, nan],
       [ 6., nan, nan, nan]])

如果使用object dtype,则数字可以是整数,但是np.isnan(arr)无效。

如果原始文件是列表而不是数组:

In [146]: alist = [[1,2,3,np.nan],[4,5,np.nan,np.nan],[6,np.nan,np.nan,np.nan]]
In [147]: alist
Out[147]: [[1, 2, 3, nan], [4, 5, nan, nan], [6, nan, nan, nan]]
In [148]: [[i for i in row if ~np.isnan(i)] for row in alist]
Out[148]: [[1, 2, 3], [4, 5], [6]]

可以使用split将平面数组转换为数组列表:

In [152]: np.split(arr[~np.isnan(arr)],(3,5))
Out[152]: [array([1., 2., 3.]), array([4., 5.]), array([6.])]

其中(3,5)拆分参数可以通过对每行中的非nan进行计数来确定,但这需要更多的工作,并且不能保证比行迭代要快。