Найти максимальный абс вычитания между списками в списке - PullRequest
0 голосов
/ 12 октября 2018

У меня есть такой список:

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

, и я хотел бы найти максимальное значение вычитания элементов между двумя последовательными списками.Пример:

Между [9,9,9] и [8,7,6] -> максимум [1,2,3] -> 3

Между [4,5,9] и [9,9,9] -> максимум [5,4,0] -> 5

Между [1,5,1] и [4,5,9] -> макс. [3,0,8] -> 8

И тогда я хотел бы иметь список с [3,5,8] Поскольку I код должен бытьсовместим с версией 1.6.1 numpy, я делаю так:

new_l = []
for index, i in enumerate(l):
    if index < len(l)-1:
        t = []
        for jndex, j in enumerate(i):
            t.append(l[index +1][jndex] - l[index][jndex])

    new_l.append(max([abs(number) for number in t]))
new_l = new_l[:-1]

Есть ли лучший способ?Заранее спасибо

Ответы [ 3 ]

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

Будет работать следующее вложенное понимание:

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

[max(map(abs, (x-y for x, y in zip(a, b)))) for a, b in zip(l, l[1:])]
# [3, 5, 8]

zip(l, l[1:]) создает пары смежных списков, которые затем снова архивируются для получения парных разностей.

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

Согласно комментарию @ Divakar , это стандартное решение NumPy:

res = np.abs(np.diff(L, axis=0)).max(1)

Для больших массивов вы можете увидеть значительное улучшение производительности через numba.Обе версии более эффективны, чем не-векторизованное понимание списка Python.

from numba import njit

L = np.array([[8,7,6], [9,9,9], [4,5,9], [1,5,1]] * 10**6)

@njit
def differ(A):
    res = np.zeros(A.shape[0]-1)
    for i in range(A.shape[0]-1):
        for j in range(A.shape[1]):
            res[i] = max(res[i], abs(A[i+1, j] - A[i, j]))
    return res

assert np.array_equal(np.abs(np.diff(L, axis=0)).max(1), differ(L))

%timeit np.abs(np.diff(L, axis=0)).max(1)  # 161 ms per loop
%timeit differ(L)                          # 53.7 ms per loop
%timeit [max(abs(i-j) for i, j in zip(*v)) for v in zip(L, L[1:])]  # 22.5 s per loop
0 голосов
/ 12 октября 2018

С обычным Python вы можете использовать списочное понимание дважды с zip:

L = [[8,7,6], [9,9,9], [4,5,9], [1,5,1]]

res = [max(abs(i-j) for i, j in zip(*values)) for values in zip(L, L[1:])]

[3, 5, 8]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...