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

时间:2018-05-04 21:29:00

标签: python for-loop if-statement signal-processing

我有一个时间信号(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 ms之间,那么我可以通过某种近似使用所有这些值来近似10 ms处的值(假设在10 ms时没有当前值)。近似方法现在并不重要,我只想捕获这些值

example of image signal

所有的帮助或建议都得到了所有人的高度赞赏。

5 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

这是我认为做你想做的事情。为了测试它,我必须创建一些示例输入数据,因为你的问题中没有任何内容 - 这是在片段的最开始发生的事情。

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

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]

答案 2 :(得分:0)

我会建议这种方法:

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

你可以用它来制作功能,每当你调用它时就会给你一块。

答案 3 :(得分:0)

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

$text = str_replace('1,300', '1,600', $text);

输出:

r=range(37913,40010,20)

答案 4 :(得分:0)

如果您不介意使用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)