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

Интересно, существуют ли специальные функции для получения столбцов самых высоких и самых низких значений моих диапазонов.

Для диапазонов вы можете предположить, что каждое первое измерение моего массива массива представляет горизонтальный ряд моего изображения.

Я рисую линии в каждом ряду моего изображения с разными координатами.

Мне нужно знать начальную и конечную точку каждой строки в каждой строке.

Предположим, у меня есть следующий массив:

РЕДАКТИРОВАТЬ: я выбрал неверный диапазон.Это лучше

a = np.array([[0, 1],[0, 2],[0, 3],[0, 4],[1, 0],[1, 1],[1, 2],[1, 3],[1, 4],[1,5],[3, 0],[3, 1],[3, 2],[3, 3],[3, 4],[4, 0],[4, 3],[4, 4],[5,0]])

Я хотел бы иметь

максимальные значения / конечные точки:

array([[0, 4],[1, 5],[3, 4],[4, 4],[5,0]])

минимальные значения / начальные точки:

array([[0, 1],[1, 0],[3, 0],[4, 0],[5,0]])

Я бы перебрал весь массив с условиями if и сравнил бы значения строк, но в этом случае я также не знаю, имеет ли смысл вообще использовать numpy для этой задачи.

Я знаю оnp.amin / amax (массив, ось) используется, но не как определить эффективные диапазоны.

EDIT2:

Так что единственное решение, которое я вижу в данный момент, состоит в том, чтобы сделать что-то подобное:

for i in image_height:
    range_array = a[a[:,0] == i]
    min = np.amin(range_array,0)
    max = np.amax(range_array,0)

Ответы [ 2 ]

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

Основная идея здесь заключается в том, чтобы использовать np.unique, чтобы получить первое уникальное значение из a[:, 0], а затем убедиться, что массив упорядочен надлежащим образом для возврата либо минимального, либо максимального результата.Если вы не верите, что массив будет отсортирован, просто установите флаг sort на True


def get_extrema(a, min=False, sort=False):
    """Finds the minimum or maximum value for each row of an array"""

    if sort:
        a = a[np.lexsort([a[:, 1], a[:, 0]])]

    if not min:
        a = np.flip(a, 0)

    _, idx = np.unique(a[:, 0], return_index=True)

    return a[idx]

>>> get_extrema(a)
array([[0, 4],
       [1, 5],
       [3, 4],
       [4, 4],
       [5, 0]])
>>> get_extrema(a, min=True)
array([[0, 1],
       [1, 0],
       [3, 0],
       [4, 0],
       [5, 0]])
0 голосов
/ 26 сентября 2018

Вот одно решение (с использованием панд):

Ввод:

import pandas as pd
df = pd.DataFrame(a)
minvalues = df.groupby([0]).min().reset_index().values
maxvalues = df.groupby([0]).max().reset_index().values

Если вы хотите сохранить минимальные и максимальные значения в качестве кадров данных панд, тогда выньте .values.

Вывод:

minvalues: array([[0, 1],[1, 0],[3, 0],[4, 0],[5, 0]], dtype=int64)
maxvalues: array([[0, 4],[1, 5],[3, 4],[4, 4],[5, 0]], dtype=int64)
...