NumPy - Исключение всех нулевых 2D-массивов из 3D-массива - PullRequest
1 голос
/ 04 августа 2020

У меня есть несколько 3D-массивов с разными формами, но я предполагаю, что у меня есть массив с именем A с формой (53, 768, 768) для примера. Он состоит из 53 2D-массивов, некоторые из которых могут быть пустыми изображениями. Эти пустые изображения имеют только значение 0 пикселей.

Если есть N фрагменты со всеми значениями 0, я хочу разрезать A в (53 - N, 768, 768) 3D-массив. Возможно ли это с индексацией?

Я пробовал что-то вроде этого a[:, ~np.all(a == 0)], но он возвращает массив с формой (53, 1, 768, 768).

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Предположим, ваши данные выглядят примерно так:

z = np.array([
    [[1, 2, 3], [4, 5, 6]],
    [[7, 8, 9], [10, 11, 12]],
    [[0, 0, 0], [0, 0, 0]],
    [[1, 1, 1], [1, 1, 1]]
])

Форма z - (4, 2, 3). Поэтому нам нужен вектор с формой 4, агрегирующий по другим измерениям. Для этого мы можем использовать параметр axis= в большинстве функций Numpy:

mask = np.all(z != 0, axis=(1, 2))
a[mask]

В этом примере mask будет array([False, False, True, False]).

Оси пронумерованы 0, 1, 2 и др. c. Таким образом, мы используем 1 и 2. для обозначения 2-й и 3-й осей.

Вы также можете использовать отрицательные числа, как в другой ответ ; если вы пишете axis=(-2, -1), что относится к последней и предпоследней осям, то есть к осям 1 и 2 в этом примере.

Как правило, используйте axis=, чтобы указать, какие оси должны быть свернуты агрегирование. Любые оси, не указанные в axis=, не будут агрегированы.

1 голос
/ 04 августа 2020

Используйте:

import numpy as np
A = np.array(A)                                 # if A is not a NumPy array
result = A[np.sum(A, axis = (-1, -2)) != 0]

Это подойдет.

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