Почему индексирование массивов в Numpy дает такой результат? - PullRequest
0 голосов
/ 12 декабря 2018

Согласно документации numpy , указание индексов массива как array_name[x, y] и array_name[x][y] эквивалентно и должно давать тот же результат.Однако следующий фрагмент кода:

import numpy as np

a = np.empty((7, 8, 9), dtype = object)
# First indexing notation
print(a[:, 0, 0].shape, a[0, :, 0].shape, a[0, 0, :].shape)
# Second indexing notation
print(a[:][0][0].shape, a[0][:][0].shape, a[0][0][:].shape)

производит выходные данные:

(7,) (8,) (9,)    
(9,) (9,) (9,)

соответственно, которые, очевидно, не эквивалентны.Что дает?

1 Ответ

0 голосов
/ 12 декабря 2018

Вы неправильно понимаете, как NumPy интерпретирует индексирование / нарезку.Что-то вроде a[x, y, z], numpy использует x для выбора по первому измерению, y по второму измерению и z по третьему измерению.

Однако, что-то вроде a[x][y][z], numpy использует x по первому измерению a, оно использует y по первому измерению a[x] и z по первомуразмерность a[x][y].

Это может сбить с толку, если вы сравните использование : с использованием некоторого числа.Почему это так?Один означает нарезку (:), другой - индексирование (нет :).Потому что разрезание по измерению (с использованием :) на самом деле не уменьшает размеры вашего массива, тогда как индексирование делает.

Может быть много примеров, чтобы представить это, но я думаю, что вам лучше пойтипоиграйте в ipython с массивом и посмотрите, как различные индексы и срезы влияют на вывод.Однако я приведу один или два примера, чтобы конкретно ответить на ваш вопрос

import numpy as np

a = np.arange(2*3*4).reshape((2,3,4))

a
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

# First indexing notation
print(a[:, 0, 0].shape, a[0, :, 0].shape, a[0, 0, :].shape)
# Prints (2,) (3,), (4,)

Разбивая это, мы возьмем каждый из них:

  • a[:, 0, 0] Принимает все первыеизмерение и 0 -й элемент для второго и третьего измерений.
  • a[0, :, 0] Принимает 0 -й элемент первого измерения, все второе измерение и 0-й элементтретьего измерения.
  • a[0, 0, :] Принимает 0 -ые элементы для первого и второго измерений и все элементы для третьего измерения.

# Second indexing notation
print(a[:][0][0].shape, a[0][:][0].shape, a[0][0][:].shape)
# Prints (4,) (4,) (4,)

В этом случае:

  • a[:] в основном совпадает с a (возвращает новый view матрицы - Google "NumPy View" для получения дополнительной информации).Поскольку a[:] совпадает с a, a[:][0] выбирает 0 элемент по первому измерению a
  • и т. Д.

OP сказал:

В соответствии с нудистской документацией , указав индексы массива как array_name [x, y] и array_name [x] [y]эквивалентны

Это правда!Главное, что нужно признать, это то, что (хотя и связанные) индексация и нарезка - это не одно и то же (как я указал выше).

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