例如,如果我具有如下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]。
谢谢!
答案 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进行计数来确定,但这需要更多的工作,并且不能保证比行迭代要快。