Как векторизовать порог на срезе в трехмерном массиве - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь векторизовать порог для среза в трехмерном массиве.К сожалению, порог применяется ко всем 3 значениям в измерении.Единственный способ, которым я могу придумать, - это извлечь фрагмент 1, процесс, который затем поместит его обратно в массив, но я уверен, что есть лучший способ.Вот код, объясняющий, что я делаю и что я пытаюсь сделать.Большое спасибо за любую помощь.J

import numpy as np
arr = np.arange(18).reshape(3, 2, 3)
arr[ arr[:,:,1] < 10 ] = 0

Дает:

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

       [[ 0,  0,  0],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17]]])

Я надеялся на:

array([[[ 0,  0,  2],
        [ 3,  0,  5]],

       [[ 6,  0,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17]]])

Ответы [ 2 ]

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

Мы можем просто использовать маску сравнений для индексации по первым двум осям и использовать нарезку на последней оси, что дает нам такой компактный способ, как это -

arr[arr[:,:,1]<10, 1] = 0

Пробный прогон -

In [47]: arr = np.arange(18).reshape(3, 2, 3)

In [48]: arr[arr[:,:,1] <10,1] = 0

In [49]: arr
Out[49]: 
array([[[ 0,  0,  2],
        [ 3,  0,  5]],

       [[ 6,  0,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17]]])
0 голосов
/ 26 февраля 2019

Это должно работать:

arr[:, :, 1][arr[:, :, 1] < 10] = 0

Это создаст логическую маску для второго элемента измерения 3 из arr с: arr[:, :, 1] < 10.Затем эта логическая маска используется только для индексации определенного фрагмента массива.

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

print(arr[..., 1])
# Out: array([[ 1,  4],
              [ 7, 10],
              [13, 16]])

В этом случае, например, вы можете использовать его следующим образом:

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