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