Python Numpy分割数组,其中NaN结束

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

我有一个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.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.]])]