Как разбить массив в соответствии с условным оператором? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть сигнал времени (от 37913 мс до 40010), и я хочу разделить его на каждые 20 мсек.

Например, за первые 20 мс:

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

Это дает мне список [37913.496549, 37916.878267, 37918.506757].

Я хочу создать несколько разных списков на каждые 20 мс. Я знаю, что это должно быть действительно просто, но почему-то я не могу придумать решение.

**** ***** Отредактированный 1011 *

Итак, для дальнейшего объяснения моей точки зрения, я действительно хочу добиться того, чтобы у меня был входящий сигнал ускорения (без ограничения по времени) (зеленые полосы) , и я хочу проверить, являются ли эти входящие выборки находятся в диапазоне 0-20 мс, 10-30 мс или 20-40 мс и так далее. Если они находятся в таком интервале, то я должен приблизить точки (черные точки) , используя эти данные. например, если текущие значения находятся в интервале от 0 до 20 мс, то я могу использовать все эти значения для аппроксимации значения через 10 мс с помощью некоторого приближения (предположим, что через 10 мсек нет текущего значения). Метод аппроксимации сейчас не важен, я просто хочу зафиксировать эти значения

example of image signal

Любая помощь или предложение высоко ценится благодаря всем заранее.

Ответы [ 5 ]

0 голосов
/ 06 мая 2018

Вот то, что я думаю делает то, что вы хотите. Чтобы проверить это, я должен был создать некоторые входные данные, поскольку у вас их нет в вашем вопросе, что и происходит в самом начале фрагмента.

Для каждого временного интервала создается отдельное «ведро», которое содержит соответствующие значения времени в пределах временного диапазона. Обратите внимание , что некоторые значения времени могут оказаться в двух сегментах, поскольку интервалы интервалов перекрываются.

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]
0 голосов
/ 05 мая 2018

Если вы не возражаете против использования 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)
0 голосов
/ 05 мая 2018

Если ваш список временных меток отсортирован:

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, поскольку для нее требуется отсортированная итерация.

0 голосов
/ 05 мая 2018

Если я понимаю ваш вопрос, вы можете использовать диапазон:

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]
0 голосов
/ 05 мая 2018

Я бы предложил этот метод:

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

Вы можете сделать из него функцию, которая дает вам кусочек каждый раз, когда вы вызываете его.

...