Как я могу отфильтровать массив с 3 измерениями в numpy - PullRequest
0 голосов
/ 28 апреля 2020

Я знаю, что это одна из самых простых задач в numpy, но я ее не понимаю. У меня есть массив:

import numpy as np

u1 = np.array([[[-2.04853845, -1.47283101,  1.        ],
                [-2.05009646, -1.46780913,  1.        ],
                [-2.05165539, -1.46278426,  1.        ]],
               [[-4.94165412,  7.8524744 ,  1.        ],
                [ 0.94540647,   0.86456925,  1.       ],
                [-4.94916228,  7.87667525,  1.        ]]])

u1 является сводкой матрицы. Реальный размер матрицы:

u1.shape
(813, 1200, 3)

Я хочу получить все значения, где первый и второй элемент последнего массива (последнее измерение) находятся в диапазоне от 0 до 1, поэтому я получаю массив, содержащий логическое значение, поэтому я могу индексировать другой массив с той же формой.

Могу поспорить, что это дублирующий вопрос, но я не нашел его. Спасибо

Ответы [ 3 ]

1 голос
/ 28 апреля 2020

IIU C Вы ищете следующее:

import numpy as np

u1 = np.array([[[-2.04853845, -1.47283101,  1.],
                [-2.05009646, -1.46780913,  1.],
                [-2.05165539, -1.46278426,  1.]],
               [[-4.94165412,  7.8524744,   1.],
                [ 0.94540647,  0.86456925,  1.],
                [-4.94916228,  7.87667525,  1.]]])

np.logical_and(u1[:,:,0:2]>0, u1[:,:,0:2]<1)
array([[[False, False],
        [False, False],
        [False, False]],

       [[False, False],
        [ True,  True],
        [False, False]]])
0 голосов
/ 28 апреля 2020

Определите следующую функцию, проверяющую первые 2 элемента строки:

def myfunc(row):
    return np.logical_and(row[0:2] >= 0, row[0:2] <= 1).all()

Затем примените ее к каждому 1-D срезу вдоль последнего измерения (назовем его строкой ) :

np.apply_along_axis( myfunc, axis=-1, arr=u1 )

Результат для ваших выборочных данных:

array([[False, False, False],
       [False,  True, False]])
0 голосов
/ 28 апреля 2020

Извлеките элементы и сравните их с вашими значениями:

import numpy as np

u1 = np.array([[[-2.04853845, -1.47283101,  1.        ],
                [-2.05009646, -1.46780913,  1.        ],
                [-2.05165539, -1.46278426,  1.        ]],
               [[-4.94165412,  7.8524744 ,  1.        ],
                [ 0.94540647,   0.86456925,  1.       ],
                [-4.94916228,  7.87667525,  1.        ]]])

first = (u1[:, :, 0] > 0) * (u1[:, :, 0] < 1)
second = (u1[:, :, 1] > 0) * (u1[:, :, 1] < 1)

condition = first * second
# Condition is:
# [[False False False]
# [False  True False]]

Затем извлеките интересующие вас строки:

values = u1[condition]

print(values)
# Prints:
# [[0.94540647 0.86456925 1.        ]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...