Есть ли функция "обратный клип" в numpy? - PullRequest
0 голосов
/ 08 января 2020

У меня есть рабочий код, но мне интересно, есть ли для него реализация numpy. Это больше для удовлетворения моего любопытства, а также для оптимизации и улучшения кода; У меня нет острой проблемы. Тем не менее, я предполагаю, что эта ситуация достаточно распространена, чтобы быть интересной для других, а не только для меня.

Итак, ситуация: я вычисляю значение много раз в al oop и хотел бы только сохранить минимальное и максимальное значение.

Изначально я использовал

import numpy as np
vals = []
for obj in objects:
    #...do stuff...
    vals.append(obj.calc_value())
    #...do more stuff
minmax = [np.min(vals), np.max(vals)]

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

import numpy as np
minmax = [np.inf, -np.inf]
for obj in objects:
    #...do stuff...
    val = obj.calc_value()
    if val < minmax[0]:
        minmax[0] = val
    if val > minmax[1]:
        minmax[1] = val
    #...do more stuff

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

Я не мог не задаться вопросом, не существует ли для этого numpy функция. Что-то вроде «обратной» clip функции. Функция, которая, подобно clip, сравнивает значение с интервалом. Но который не возвращает (возможно, измененное) значение, так что оно лежит в предоставленном интервале (что и делает clip), а скорее возвращает (возможно, расширенный) интервал, который необходим, чтобы предоставленное значение лежало в нем.

import numpy as np
minmax = [np.inf, -np.inf]
for obj in objects:
    #...do stuff...
    minmax = np.reverse_clip(minmax, obj.calc_value())
    #...do more stuff

Если есть, я бы хотел услышать об этом. Кроме того, какие-нибудь идеи, как я мог найти это, не спрашивая здесь? Я посмотрел на numpy методы массива, но не смог найти его там.

1 Ответ

0 голосов
/ 08 января 2020

Вы можете поменять знак на первом элементе и применить max к обоим, а затем изменить его после l oop:

for obj in objects:
    i = obj.calc_value()
    minmax= map(max, zip([-i, i], minmax)) # using python
    minmax = np.vstack((minmax, [-i, i])).max(0) #using numpy
minmax *= np.array([-1, 1]) #using numpy
minmax = [i * j for i, j in zip(a1, [-1, 1])] # using python, or do list(a1) * np.array([-1, 1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...