NaN结束的Numpy分裂阵列

时间:2018-05-23 16:24:48

标签: 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.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  ]]

在纳米结束处分割阵列的最佳方法是什么。

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],则会导致下面的子数组。

注意

我希望数组在每个nans系列的末尾分开,我上面给出的例子很方便地排列了所有nans

4 个答案:

答案 0 :(得分:2)

您可以使用:

wh = np.isnan(x).any(1).argmin()

然后x[:wh]x[wh:]就是你想要的。

答案 1 :(得分:1)

如果你确定列中的nan是继续的,你可以找到相应行的最新索引,如下所示:

In [16]: np.where(np.isnan(x).any(1))[0][-1] + 1
Out[16]: 13

然后您可以使用np.split()分割数组:

np.split(x, [np.where(np.isnan(x).any(1))[0][-1] + 1])

如果您不确定,即nan可以存在于任何索引中。您可以对阵列的raveled版本执行类似的方法,并通过将最新的nan除以第二轴长度来查找索引。

In [38]: (np.where(np.isnan(x.ravel()))[0][-1] + 1)//x.shape[1]
Out[38]: 13

演示:

In [18]: np.split(x, [np.where(~np.isnan(x).any(1))[0][0]])
Out[18]: 
[array([[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]]),
 array([[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 ]])]

答案 2 :(得分:0)

如果所有nan都在最后一列,您可以使用

x = [x[np.where(np.isnan(x[:, 4])), :][0], x[np.where(~np.isnan(x[:, 4])), :][0]]

我保留了重用变量x的注释。

答案 3 :(得分:0)

如果我正确地理解了Q,那么可能有两个以上的区块 - 到目前为止所发布的答案似乎都没有解决这个问题。

只要nan的列结束,就会分割以下代码:

>>> 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.]])]