Вы неправильно понимаете, как 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]эквивалентны
Это правда!Главное, что нужно признать, это то, что (хотя и связанные) индексация и нарезка - это не одно и то же (как я указал выше).