Макс 99 процентов в окне списка списков - PullRequest
0 голосов
/ 26 октября 2018

У меня есть список списков (2000x1000), но в качестве примера рассмотрим этот (10x3):

l = [[8, 7, 6], [5, 3, 1], [4, 5, 9], [1, 5, 1], [3, 5, 7], [8, 2, 5], [1, 9, 2], [8, 7, 6], [9, 9, 9], [4, 5, 9]] 

В этом примере каждый список соответствует 3 измерениям каждого момента:

t0 -> [8,7,6]

t1 -> [5,3,1] и т. Д.

Я хотел бы сравнить измерения сокно из 4 мгновений для позиции и принимает максимальное значение, которое находится в 99 процентиле от пика к пиковому значению.

ПРИМЕР

Давайте рассмотрим первое окно:

[8, 7, 6], [5, 3, 1], [4, 5, 9], [1, 5, 1] :
[8,5,4,1] -> peak to peak: 8-1=7
[7,3,5,5] -> ptp=4
[6,1,9,1] -> ptp=8

с этими 3 значениями [7,6,8] Я хочу взять максимум в 99 процентов, в данном случае 7

Для второго окна:

[5, 3, 1], [4, 5, 9], [1, 5, 1], [3, 5, 7]:
[5,4,1,3] -> ptp=4
[3,5,5,5] -> ptp=2
[1,9,1,7] -> ptp=8

максимум в 99 процентов -> 4 После того, как я сделаю это для всех окон размера 4, я хочу составить список с этими значениями.

Мой код следующий, но он медленный.Есть ли быстрый способ реализовать это?

ПРИМЕЧАНИЕ: я не могу использовать панд, и версия Numpy должна быть <= 1.6 </h2> num_meas = 4 m = [] for index, i in enumerate(l): if index < len(l) - num_meas + 1: p = [] for j in range(len(i)): t = [] for k in range(num_meas): t.append(l[index + k][j]) t = [x for x in t if ~np.isnan(x)] try: a = np.ptp(t) except ValueError: a = 0 p.append(a) perce = np.percentile(p, 99) p = max([el for el in p if el < perce]) m.append(p) print m Вывод: [7, 4, 7, 6, 5, 7, 7]

1 Ответ

0 голосов
/ 26 октября 2018

Пожалуйста, проверьте, работает ли следующий код с NumPy 1.6:

import numpy as np

l = [[8, 7, 6], [5, 3, 1], [4, 5, 9], [1, 5, 1], [3, 5, 7], [8, 2, 5],
     [1, 9, 2], [8, 7, 6], [9, 9, 9], [4, 5, 9]]

l = np.array(l)

# range matrix
mat_ptp = np.zeros((l.shape[0]-3, l.shape[1]))

for i in range(l.shape[0]-3):
    l[i:i+4].ptp(axis=0, out=mat_ptp[i])

percentiles = np.percentile(mat_ptp, 99, axis=1)
greater_pos = np.greater_equal(mat_ptp, percentiles.reshape(-1, 1))
mat_ptp[greater_pos] = -np.inf

result = np.max(mat_ptp, axis=1)

Для повышения производительности, вы можете попытаться максимально контролировать ваши операции, используя numpy.Это может быть намного быстрее, чем использование for циклов и функции append.

РЕДАКТИРОВАНИЕ

Извините, я не заметил, что вы хотели, чтобы выбранные элементыстрого меньше, чем процентиль.Вот правильная версия.

BENCHMARK

Просто чтобы проверить вопрос о производительности, вот результат с:

l = np.random.randint(0, 100, size=(200, 100))

run 100раз с timeit:

OP code: 0.5197743272900698 ms in average
Code above: 0.0021439407201251015 in average
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...