Есть ли функция «ограничивающей коробки» (среза с ненулевыми значениями) для Ndarray в Numpy?

StackOverflow https://stackoverflow.com/questions/4808221

Вопрос

Я имею дело с массивами, созданными через numpy.array (), и мне нужно нарисовать точки на холсте, имитируя изображение. Поскольку вокруг центральной части массива есть много нулевых значений, которые содержат значимые данные, я хотел бы «обрезать» массив, стирающие столбцы, которые содержат только нули и строки, которые содержат только нули.

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

(Поскольку это концептуальный вопрос, я не ставил никакого кода, извините, если я должен, я очень свежо публикую в SO.)

Спасибо за чтение

Это было полезно?

Решение

Код ниже, из этот ответ Проходит быстрее всего в моих тестах:

def bbox2(img):
    rows = np.any(img, axis=1)
    cols = np.any(img, axis=0)
    ymin, ymax = np.where(rows)[0][[0, -1]]
    xmin, xmax = np.where(cols)[0][[0, -1]]
    return img[ymin:ymax+1, xmin:xmax+1]

Принятый ответ с использованием argwhere работал, но бежал медленнее. Я предполагаю, что это потому, что argwhere выделяет гигантский выходной массив индексов. Я протестировал на большом 2D -массиве (изображение 1024 x 1024, примерно с ненулевой областью 50x100).

Другие советы

Это должно это сделать:

from numpy import array, argwhere

A = array([[0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 1, 0, 0, 0, 0],
           [0, 0, 1, 1, 0, 0, 0],
           [0, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0]])

B = argwhere(A)
(ystart, xstart), (ystop, xstop) = B.min(0), B.max(0) + 1 
Atrim = A[ystart:ystop, xstart:xstop]

Что-то типа:

empty_cols = sp.all(array == 0, axis=0)
empty_rows = sp.all(array == 0, axis=1)

Полученные массивы будут 1D Boolian массивы. Пылька на них с обоих концов, чтобы найти «ограничивающую коробку».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top