Как условно установить значения в определенной позиции вдоль определенной оси numpy ndarray - PullRequest
1 голос
/ 12 января 2020

Я ищу эффективный, pythoni c способ установки n-го значения вдоль одной оси в ndarray в соответствии с условным тестом. Вот пример.

Начальный ndarray:

array([[[111, 112, 113, 114],
        [121, 122, 123, 124]],

       [[211, 212, 213, 214],
        [221, 222, 223, 224]],

       [[311, 312, 313, 314],
        [321, 322, 323, 324]]])

Я хотел бы проверить элементы в позиции 2 вдоль самой внутренней оси (ось 2), так что, другими словами, все числа в этом примере это заканчивается на 3. Если число ниже предельного значения, мы скажем 215, затем установите значение на 0.

Результат будет выглядеть так:

array([[[111, 112, 0, 114],
        [121, 122, 0, 124]],

       [[211, 212, 0, 214],
        [221, 222, 223, 224]],

       [[311, 312, 313, 314],
        [321, 322, 323, 324]]])

Я пробовал комбинации логического индексирования, numpy .where и др. c. но изоляция n-го элемента вдоль определенной оси при использовании необычного индексирования, по-видимому, является, по крайней мере, одним уровнем сложности за пределы любых примеров, которые я могу найти. Я надеюсь, что это вызывает интересный вопрос, и я благодарен за любую помощь.

1 Ответ

1 голос
/ 12 января 2020

Чтобы получить доступ ко всем 2-м столбцам вдоль оси 0, используйте [:,:,2] (или a[...,2]):

a[:,:,2]

array([[113, 123],
       [213, 223],
       [313, 323]])

Чтобы изменить эти значения в зависимости от некоторых условий (например, <215), вы можете сделать следующее: </p>

mask = a[:,:,2] < 215
a[:,:,2][mask] = 0

Результат:

array([[[111, 112,   0, 114],
        [121, 122,   0, 124]],

       [[211, 212,   0, 214],
        [221, 222, 223, 224]],

       [[311, 312, 313, 314],
        [321, 322, 323, 324]]])
...