当序列两端均具有特定值时,将numpy数组拆分为子数组

时间:2018-10-20 10:18:22

标签: python arrays numpy split

我有一个如下的numpy数组:

array([0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.00791667, 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.06837452, 0.09166667, 0.00370881, 0.        ,
       0.        , 0.00489809, 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.23888889, 0.        , 0.05927778,
       0.12138889, 0.        , 0.        , 0.        , 0.36069444,
       0.31711111, 0.16333333, 0.15005556, 0.01      , 0.005     ,
       0.14357413, 0.        , 0.15722222, 0.29494444, 0.3245    ,
       0.31276639, 0.095     , 0.04750292, 0.09127039, 0.        ,
       0.06847222, 0.17      , 0.18039233, 0.21567804, 0.15913079,
       0.4579781 , 0.        , 0.2459    , 0.14886556, 0.08447222,
       0.        , 0.13722222, 0.28336984, 0.0725    , 0.077355  ,
       0.45166391, 0.        , 0.24892933, 0.25360062, 0.        ,
       0.12923041, 0.16145892, 0.48771795, 0.38527778, 0.29432968,
       0.31983305, 1.07573089, 0.30611111, 0.        , 0.0216475 ,
       0.        , 0.62268056, 0.16829156, 0.46239719, 0.6415958 ,
       0.02138889, 0.76457155, 0.05711551, 0.35050949, 0.34856278,
       0.15686164, 0.23158889, 0.16593262, 0.34961111, 0.21247575,
       0.14116667, 0.19414785, 0.09166667, 0.93376627, 0.12772222,
       0.00366667, 0.10297222, 0.173     , 0.0381225 , 0.22441667,
       0.46686111, 0.18761111, 0.56037889, 0.47566111])

从该数组中,我需要为每个子数组计算曲线下的面积,其中第一个值为0,大于0且最后一个数字应为非零数字后的0。显然,阵列长度会有所不同。这些子数组中的两个也可能会共享一个0值(如果第二个数组,第一个数组的最后一个0将是第一个0)。

预期的前两个数组应该是:

[0.        ,           0.00791667, 0.        ]
[0.        , 0.06837452, 0.09166667, 0.00370881, 0.        ]

我已经尝试过根据等于0的字符来分割python列表,但是没有发现任何有用的东西。我该怎么办?

1 个答案:

答案 0 :(得分:3)

请参见下面的代码-我认为这是您能够做到的最有效的方法。

首先,使用所有零的索引分割数组。在多个零在一起的情况下,这会产生几个[ 0. ]数组,因此请过滤掉它们(基于长度,因为所有数组必须以零开头),以产生C。最后,因为它们都以零开头,但没有一个以零结尾,将零添加到每个数组。

import numpy as np

# <Your array here>
A = np.array(...)

# Split into arrays based on zeroes
B = np.split(A, np.where(A == 0)[0])

# Filter out arrays of length 1
#  (just a zero, caused by multiple zeroes together)
f = np.vectorize(lambda a: len(a) > 1)
C = np.extract(f(B), B)

# Append a zero to each array
g = np.vectorize(lambda a: np.append(a, 0), otypes=[object])
D = g(C)

# Output result
for array in D:
    print(array)

这将提供以下输出:

[ 0.          0.00791667  0.        ]
[ 0.          0.06837452  0.09166667  0.00370881  0.        ]
[ 0.          0.00489809  0.        ]
[ 0.          0.23888889  0.        ]
[ 0.          0.05927778  0.12138889  0.        ]
[ 0.          0.36069444  0.31711111  0.16333333  0.15005556  0.01        0.005
  0.14357413  0.        ]
[ 0.          0.15722222  0.29494444  0.3245      0.31276639  0.095
  0.04750292  0.09127039  0.        ]
[ 0.          0.06847222  0.17        0.18039233  0.21567804  0.15913079
  0.4579781   0.        ]
[ 0.          0.2459      0.14886556  0.08447222  0.        ]
[ 0.          0.13722222  0.28336984  0.0725      0.077355    0.45166391
  0.        ]
[ 0.          0.24892933  0.25360062  0.        ]
[ 0.          0.12923041  0.16145892  0.48771795  0.38527778  0.29432968
  0.31983305  1.07573089  0.30611111  0.        ]
[ 0.         0.0216475  0.       ]
[ 0.          0.62268056  0.16829156  0.46239719  0.6415958   0.02138889
  0.76457155  0.05711551  0.35050949  0.34856278  0.15686164  0.23158889
  0.16593262  0.34961111  0.21247575  0.14116667  0.19414785  0.09166667
  0.93376627  0.12772222  0.00366667  0.10297222  0.173       0.0381225
  0.22441667  0.46686111  0.18761111  0.56037889  0.47566111  0.        ]