Как правильно индексировать большую матрицу в Python - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть большой массив с определенными записями.Допустим, фиктивный пример:

    arr = np.array([[[1.0, 2.0, 3.0],[1.5, 1.8, 3.2]],
                    [[1.3, 1.7, 1.9],[1.4, 1.9, 2.1]],
                    [[1.8, 2.2, 2.5],[2.0, 2.2, 2.8]]])

Я хотел бы знать все индексы, где записи arr попадают в некоторый диапазон, скажем, 1.5 и 2.4.И я хотел бы заполнить другую матрицу той же формы, что и arr, с 1 в индексах, где значение arr попадает в диапазон, в противном случае - 0.То есть я хотел бы получить такую ​​матрицу:

mask = np.array([[[0, 1, 0], [1, 1, 0]],
                 [[0, 1, 1], [0, 1, 1]],
                 [[1, 1, 0], [1, 1, 0]]])

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

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Создайте логическую маску, соответствующую вашим условиям.Добавление 0 к логическим значениям преобразует их в числовые результаты:

import numpy as np

arr = np.array([[[1.0, 2.0, 3.0],[1.5, 1.8, 3.2]],
                [[1.3, 1.7, 1.9],[1.4, 1.9, 2.1]],
                [[1.8, 2.2, 2.5],[2.0, 2.2, 2.8]]])

arr_out = ((arr>=1.5) & (arr<=2.4)) + 0
print(arr_out)

В качестве альтернативы:

arr_out = np.array(((arr>=1.5) & (arr<=2.4)), dtype=np.uint8)
print(arr_out)

Или, как предлагает @hpaulj:

arr_out = ((arr>=1.5) & (arr<=2.4)).astype(int)
print (arr_out)

Вывод:

[[[0 1 0]
  [1 1 0]]

 [[0 1 1]
  [0 1 1]]

 [[1 1 0]
  [1 1 0]]]
0 голосов
/ 22 февраля 2019

Вы можете использовать маскировку и np.where: сначала создайте условную маску, объединяющую два ваших граничных условия, а затем передайте ее np.where.Матрице будет присвоено 1, где это условие имеет значение True, иначе 0, если ее значение False

Минимальный рабочий ответ

import numpy as np

arr = np.array([[[1.0, 2.0, 3.0],[1.5, 1.8, 3.2]],
                [[1.3, 1.7, 1.9],[1.4, 1.9, 2.1]],
                [[1.8, 2.2, 2.5],[2.0, 2.2, 2.8]]])

mask = ((arr>1.5) & (arr<2.4))
arr = np.where(mask, 1, 0)
print (arr)

Выход

array([[[0, 1, 0],
        [0, 1, 0]],

       [[0, 1, 1],
        [0, 1, 1]],

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