如何根据条件语句拆分数组?

How to split an array according to conditional statement?

我有一个时间信号(37913 毫秒到 40010),我想每隔 20 毫秒将其拆分一次。

例如前 20 毫秒:

for t in time:
    if t>=37913 and t< 37933:
        list1.append(t)

这给了我列表 [37913.496549, 37916.878267, 37918.506757]

我想每隔 20 毫秒制作几个不同的列表。我知道这应该很简单,但不知何故我想不出解决办法。

****已编辑****

所以为了进一步解释我的观点,我真正想要实现的是,有一个传入的加速度(没有时间上限)信号 (绿条) 我想要检查这些传入样本是否在 0-20 毫秒、10-30 毫秒或 20-40 毫秒等范围内。如果它们处于这样的间隔中,那么我必须使用此数据来近似点 (黑点)。例如,如果当前值在 0-20 毫秒之间,那么我可以使用所有这些值通过某种近似来近似 10 毫秒时的值(假设 10 毫秒时没有当前值)。逼近方法现在不重要,我只想捕捉这些值

非常感谢所有提前提供的帮助或建议。

我会建议这个方法:

 arrs = []
 while len(arr) > 20:
     pice = arr[:20]
     arrs.append(pice)
     arr   = arr[20:]
 arrs.append(arr)

你可以用它做函数,每次调用它都会给你一块。

如果您的时间戳列表已排序:

from itertools import groupby
sample = range(100)
INTERVAL_SIZE = 20
key = lambda x: x // INTERVAL_SIZE
list(list(v) for k, v in groupby(sample, key=key))

会给你:

[
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
    [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
    [40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
    [60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
    [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
]

如果未排序,请在使用 groupby 之前添加一个排序(按 key),因为它需要一个已排序的迭代器。

如果我理解你的问题,你可以使用一个范围:

r=range(37913,40010,20)

输出:

[37913, 37933, 37953, 37973, 37993, 38013, 38033, 38053, 38073, 38093, 
38113, 38133, 38153, 38173, 38193, 38213, 38233, 38253, 38273, 38293, 
38313, 38333, 38353, 38373, 38393, 38413, 38433, 38453, 38473, 38493, 
38513, 38533, 38553, 38573, 38593, 38613, 38633, 38653, 38673, 38693, 
38713, 38733, 38753, 38773, 38793, 38813, 38833, 38853, 38873, 38893, 
38913, 38933, 38953, 38973, 38993, 39013, 39033, 39053, 39073, 39093, 
39113, 39133, 39153, 39173, 39193, 39213, 39233, 39253, 39273, 39293, 
39313, 39333, 39353, 39373, 39393, 39413, 39433, 39453, 39473, 39493, 
39513, 39533, 39553, 39573, 39593, 39613, 39633, 39653, 39673, 39693, 
39713, 39733, 39753, 39773, 39793, 39813, 39833, 39853, 39873, 39893, 
39913, 39933, 39953, 39973, 39993]

如果您不介意使用 numpy,您可以试试这个:

import numpy as np

#a = np.arange(37913,40010+1,1)
a = np.arange(0,10+1,1) # comment this and uncomment above for your case
nlen = 2
parts = np.array_split(a,int(np.ceil(len(a) / nlen)))
print("a = {}".format(a)) # [ 0  1  2  3  4  5  6  7  8  9 10]
print("len(a) = {}".format(len(a))) # 11
print("parts[0] = {}".format(parts[0])) # [0 1]
print("parts[-1] = {}".format(parts[-1])) # [10]

如果你只想将整个数组分成 n 个部分,只需这样做:

nparts = 6
np.array_split(a,nparts)

这是我认为做的事情。为了测试它,我必须创建一些样本输入数据,因为您的问题中没有任何数据——这就是代码片段开头发生的事情。

对于每个时间范围间隔,它创建一个单独的"bucket",其中包含时间范围内的相应时间值。 注意由于间隔范围重叠,一些时间值最终可能会被放置在两个桶中。

from pprint import pprint
import random
random.seed(42)  # Create same "random" sequence each run for testing.

# First create some test data.
INTERVAL = 0.02  # 20 ms
start = 37913
times = []

nvalues = 2, 3, 4, 2, 1  # Number of values in each interval.

for i, nvalue in enumerate(nvalues):
    lowerbounds = start + i*INTERVAL
    upperbounds = start + (i+1)*INTERVAL
    for _ in range(nvalue):
        times.append(random.uniform(lowerbounds, upperbounds))

print('There are {} time values:'.format(len(times)))
times.sort()  # Put into ascending order.
pprint(times)

#=======
# Split the times up into "buckets" of values depending on their range.
HALF_INTERVAL = INTERVAL / 2
brackets = []
print()
print('Time brackets:')
st = int(min(times))
for i in range(4):
    begin = round(st + i*HALF_INTERVAL, 6)
    end = round(begin + INTERVAL, 6)
    brackets.append((begin, end))
    print(' ', begin, end)

buckets = [[] for _ in range(len(brackets))]  # Create empty buckets.
for t in times:  # Put each time in the cooresponding bucket of times.
    for i, (begin, end) in enumerate(brackets):
        if begin <= t <= end:
            buckets[i].append(t)

print()
print('Stored in corresponding interval bucket:')
for i, bracket in enumerate(brackets):
    print('bucket[{}]: range: {!r}, values: {}'.format(
            i, bracket, buckets[i]))

示例输出:

There are 12 time values:
[37913.0005002151,
 37913.01278853597,
 37913.02446421476,
 37913.025500586366,
 37913.03472942428,
 37913.04173877665,
 37913.048438436395,
 37913.05353398975,
 37913.05784359135,
 37913.060595944386,
 37913.064372759494,
 37913.09010710576]

Time brackets:
  37913.0 37913.02
  37913.01 37913.03
  37913.02 37913.04
  37913.03 37913.05

Stored in corresponding interval bucket:
bucket[0]: range: (37913.0, 37913.02), values: [37913.0005002151, 37913.01278853597]
bucket[1]: range: (37913.01, 37913.03), values: [37913.01278853597, 37913.02446421476, 37913.025500586366]
bucket[2]: range: (37913.02, 37913.04), values: [37913.02446421476, 37913.025500586366, 37913.03472942428]
bucket[3]: range: (37913.03, 37913.05), values: [37913.03472942428, 37913.04173877665, 37913.048438436395]