Python Numpy分割数组,其中NaN结束
我有一个numpy数组,如下所示:Python Numpy分割数组,其中NaN结束,python,arrays,numpy,Python,Arrays,Numpy,我有一个numpy数组,如下所示: x = [[ 839.41 128.3 92.47 51.78 nan] [ 823. 126.43 91.31 51.63 nan] [ 819. 126.6 93.03 51.77 nan] [ 776.32 123.6 93.85 52.02 nan] [ 755.12 120
x =
[[ 839.41 128.3 92.47 51.78 nan]
[ 823. 126.43 91.31 51.63 nan]
[ 819. 126.6 93.03 51.77 nan]
[ 776.32 123.6 93.85 52.02 nan]
[ 755.12 120.93 92.48 49.955 nan]
[ 739.01 129.84 97.68 50.75 nan]
[ 760.17 128.36 98.26 51.1 nan]
[ 780.37 131.57 98.82 51.52 nan]
[ 740.34 129.89 98.5 50.48 nan]
[ 768.65 133.37 104.86 51.71 nan]
[ 757.75 135.15 103.93 50.9297 nan]
[ 760.58 135.02 105.15 51.91 nan]
[ 750.03 134.15 104.28 50.84 nan]
[ 795.99 133.56 109.02 53.92 57.12 ]
[ 817.13 135. 108.04 52.92 57.84 ]
[ 808.23 135.6 107.645 53.2 57.66 ]]
在nan结束的位置拆分阵列的最佳方法是什么
x =
[[ 839.41 128.3 92.47 51.78 nan]
[ 823. 126.43 91.31 51.63 nan]
[ 819. 126.6 93.03 51.77 nan]
[ 776.32 123.6 93.85 52.02 nan]
[ 755.12 120.93 92.48 49.955 nan]
[ 739.01 129.84 97.68 50.75 nan]
[ 760.17 128.36 98.26 51.1 nan]
[ 780.37 131.57 98.82 51.52 nan]
[ 740.34 129.89 98.5 50.48 nan]
[ 768.65 133.37 104.86 51.71 nan]
[ 757.75 135.15 103.93 50.9297 nan]
[ 760.58 135.02 105.15 51.91 nan]
[ 750.03 134.15 104.28 50.84 nan]]
[[ 795.99 133.56 109.02 53.92 57.12 ]
[ 817.13 135. 108.04 52.92 57.84 ]]
如果我调用x[0]
它将生成包含nans
的子数组,如果我调用x[1]
它将生成该子数组下面的子数组
注意
我希望数组在每一系列NaN的末尾拆分,我上面给出的示例正好方便地将所有的NaN
排列在一起 您可以使用:
wh = np.isnan(x).any(1).argmin()
然后
x[:wh]
和x[wh:
就是您想要的。如果您确定nan
s在列中继续,您可以找到相应行的最新索引,如下所示:
In [16]: np.where(np.isnan(x).any(1))[0][-1] + 1
Out[16]: 13
然后可以使用np.split()
拆分数组:
如果您不确定,即nan
s可以存在于任何索引中。您可以对数组的raveled版本执行类似的方法,并通过将最新的nan
除以第二个轴长度来查找索引
In [38]: (np.where(np.isnan(x.ravel()))[0][-1] + 1)//x.shape[1]
Out[38]: 13
演示:
如果所有
nan
都在最后一列中,则可以使用
x = [x[np.where(np.isnan(x[:, 4])), :][0], x[np.where(~np.isnan(x[:, 4])), :][0]]
我保留了你重复使用变量
x
的符号,如果我正确理解了Q,那么可能会出现两个以上的块——到目前为止发布的答案似乎都没有解决这个问题
每当nan
s列结束时,以下代码将拆分:
>>> A = np.random.randint(0, 10, (10, 4)).astype(float)
>>> for i in range(4):
... A[slice(*np.sort(np.random.randint(2*i, 2*i + 6, (2,)))), np.random.randint(0, 4)] = np.nan
...
>>> A
array([[ 3., 9., 1., 7.],
[ 1., 8., 3., 0.],
[nan, 1., 7., 9.],
[nan, 1., 9., 0.],
[nan, 3., 8., 6.],
[ 3., 2., 6., 0.],
[ 3., 7., 9., 6.],
[ 7., 6., 7., nan],
[ 3., 0., 9., nan],
[nan, 2., 2., 2.]])
>>>
>>> nans = np.isnan(A)
>>> idx = np.where((nans[:-1] & ~nans[1:]).any(axis=1))[0] + 1
>>>
>>> from pprint import pprint
>>>
>>> pprint(np.split(A, idx, axis=0))
[array([[ 3., 9., 1., 7.],
[ 1., 8., 3., 0.],
[nan, 1., 7., 9.],
[nan, 1., 9., 0.],
[nan, 3., 8., 6.]]),
array([[ 3., 2., 6., 0.],
[ 3., 7., 9., 6.],
[ 7., 6., 7., nan],
[ 3., 0., 9., nan]]),
array([[nan, 2., 2., 2.]])]
x = [x[np.where(np.isnan(x[:, 4])), :][0], x[np.where(~np.isnan(x[:, 4])), :][0]]
>>> A = np.random.randint(0, 10, (10, 4)).astype(float)
>>> for i in range(4):
... A[slice(*np.sort(np.random.randint(2*i, 2*i + 6, (2,)))), np.random.randint(0, 4)] = np.nan
...
>>> A
array([[ 3., 9., 1., 7.],
[ 1., 8., 3., 0.],
[nan, 1., 7., 9.],
[nan, 1., 9., 0.],
[nan, 3., 8., 6.],
[ 3., 2., 6., 0.],
[ 3., 7., 9., 6.],
[ 7., 6., 7., nan],
[ 3., 0., 9., nan],
[nan, 2., 2., 2.]])
>>>
>>> nans = np.isnan(A)
>>> idx = np.where((nans[:-1] & ~nans[1:]).any(axis=1))[0] + 1
>>>
>>> from pprint import pprint
>>>
>>> pprint(np.split(A, idx, axis=0))
[array([[ 3., 9., 1., 7.],
[ 1., 8., 3., 0.],
[nan, 1., 7., 9.],
[nan, 1., 9., 0.],
[nan, 3., 8., 6.]]),
array([[ 3., 2., 6., 0.],
[ 3., 7., 9., 6.],
[ 7., 6., 7., nan],
[ 3., 0., 9., nan]]),
array([[nan, 2., 2., 2.]])]