Нахождение максимума в строке при выполнении условия - PullRequest
0 голосов
/ 09 марта 2020

У меня следующая относительно простая проблема. У меня есть два массива, сохраняющих x и y координаты на временной шаг, например,

x = [[0, 1, 2, 3], [0.1, 1.1, 2.1, 3.1]]
y = [[0.5, 0.5, 0.5, 0.5], [0.51, 0.52, 0.49, 0.53]]

, в которых представлены 2 временных шага (2 строки). Я хотел бы найти максимальную y координату на строку при выполнении условия x >= 1 and x <= 2.5.

Как я могу определить функцию, которая возвращает массив из 2 столбцов с max(y) на строку, когда выполняется условие пространственного x?

Я пытался np.where без удачи , Результат, который должна вернуть функция:

[0.5, 0.52]

Ответы [ 3 ]

0 голосов
/ 09 марта 2020

Как вы предлагали решение Numpy:

import numpy as np

x = np.array([[0, 1, 2, 3], [0.1, 1.1, 2.1, 3.1]])
y = np.array([[0.5, 0.5, 0.5, 0.5], [0.51, 0.52, 0.49, 0.53]])

print([np.max(y[i][(x[i] >= 1) & (x[i] <= 2.5)]) for i in range(len(x))])

дает

[0.5, 0.52]
0 голосов
/ 09 марта 2020

Вы можете использовать функцию маски numpy. Функция маски «маскирует» истинные значения, поэтому условия меняются.

import numpy as np

x = [[0, 1, 2, 3], [0.1, 1.1, 2.1, 3.1]]
y = [[0.5, 0.5, 0.5, 0.5], [0.51, 0.52, 0.49, 0.53]]

x = np.array(x)
y = np.array(y)

y_masked = np.ma.masked_where((x>2.5) | (x<1), y)
result = np.max(y_masked, axis = 1)

print(result)
0 голосов
/ 09 марта 2020

Не очень красиво, но используя чистый Python (нет numpy), вы можете объединить zip, filter и max:

>>> x = [[0,1,2,3],[0.1,1.1,2.1,3.1]]
>>> y = [[0.5,0.5,0.5,0.5],[0.51,0.52,0.49,0.53]]
>>> [max(filter(lambda t: 1.0 <= t[0] <= 2.5, zip(rx, ry)), key=lambda t: t[1])[1]
...  for rx, ry in zip(x, y)]
...
[0.5, 0.52]

или немного короче, используя понимание списка для фильтрации и обратного порядка кортежей, поэтому max может использовать естественное упорядочение:

>>> [max((y, x) for (x, y) in zip(rx, ry) if 1.0 <= x <= 2.5)[0]
...  for rx, ry  in zip(x, y)]
...
[0.5, 0.52]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...