Python 当序列两端都有特定值时,将numpy数组拆分为子数组
我有一个numpy数组,如下所示:Python 当序列两端都有特定值时,将numpy数组拆分为子数组,python,arrays,numpy,split,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,
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. , 0.00791667, 0. ]
[0. , 0.06837452, 0.09166667, 0.00370881, 0. ]
我尝试过根据等于0的字符拆分python列表,但没有发现任何有用的东西。我能做什么?请看下面的代码-我认为这是您能做的最有效的 首先,使用所有零的索引拆分数组。如果多个零放在一起,则会生成多个
[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.]
数组,因此将这些数组过滤掉(基于长度,因为所有数组都必须以零开头)以生成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)
其中(numpy.r_[test[:-1]==0,True]&numpy.r_[test[1:]>test[:-1],True])将为您提供所有定界0。这里:数组([9,15,20,26,28,33,41,49,56,60,66,69,78,80,108]),然后在此循环。我还没有找到一种在一个“命令”numpy中生成数组的方法。其中(numpy.r_[test[:-1]==0,True]&numpy.r_[test[1:]>test[:-1],True])将为您提供所有的定界0。这里:数组([9,15,20,26,28,33,41,49,56,60,66,69,78,80,108]),然后在此循环。我还没有找到在一个“命令”中生成数组的方法