Индексирование массива numpy с помощью массива index с более низким значением dim дает массив с более высоким значением dim, чем оба - PullRequest
8 голосов
/ 09 июля 2019
a = np.zeros((5,4,3))
v = np.ones((5, 4), dtype=int)
data = a[v]
shp = data.shape

Этот код дает shp==(5,4,4,3)

Я не понимаю, почему. Как можно вывести больший массив? не имеет смысла для меня и хотел бы объяснения.

Ответы [ 3 ]

6 голосов
/ 09 июля 2019

Это известно как расширенное индексирование . Расширенная индексация позволяет выбирать произвольные элементы во входном массиве на основе N-мерного индекса.

Давайте рассмотрим еще один пример:

a = np.random.randint(1, 5, (5,4,3))
v = np.ones((5, 4), dtype=int)

Скажем в этом случае a это:

array([[[2, 1, 1],
        [3, 4, 4],
        [4, 3, 2],
        [2, 2, 2]],

       [[4, 4, 1],
        [3, 3, 4],
        [3, 4, 2],
        [1, 3, 1]],

       [[3, 1, 3],
        [4, 3, 1],
        [2, 1, 4],
        [1, 2, 2]],
        ...

Индексируя массивом np.ones:

print(v)

array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]])

Вы просто будете индексировать a с 1 вдоль первой оси столько раз, сколько v. Говоря по-другому, когда вы делаете:

a[1]

[[4, 4, 1],
 [3, 3, 4],
 [3, 4, 2],
 [1, 3, 1]]

Вы индексируете по первой оси, поскольку индексация по дополнительным осям не указана. Это то же самое, что и a[1, ...], то есть полный срез вдоль оставшихся осей. Следовательно, если индексировать их массивом 2D, у вас будет вышеупомянутый 2D массив (5, 4) раз, сложенный вместе, в результате чего образуется массив (5, 4, 4, 3). Или, другими словами, a[1], формы (4,3), сложены 5*4=20 раз.

Следовательно, в этом случае вы получите:

array([[[[4, 4, 1],
         [3, 3, 4],
         [3, 4, 2],
         [1, 3, 1]],

        [[4, 4, 1],
         [3, 3, 4],
         [3, 4, 2],
         [1, 3, 1]],
         ...
0 голосов
/ 09 июля 2019

значение v:

[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]

каждый 1 индексирует полную «строку» в a, но каждый «элемент» в указанной «строке» является матрицей. поэтому каждая «строка» в v индексирует «строку» «матрицы» в a. (это имеет какой-то смысл для вас ..?)

, так что вы получите 5 * 4 1 с, каждая представляет собой 4 * 3 "матрицу".

если вместо zeroes вы определите a как a = np.arange(5*4*3).reshape((5, 4, 3)) это может быть легче понять, потому что вы видите, какие части a выбираются:

import numpy as np

a = np.arange(5*4*3).reshape((5, 4, 3))
v = np.ones((5,4), dtype=int)
data = a[v]
print(data)

(вывод довольно длинный, я не хочу его здесь вставлять)

0 голосов
/ 09 июля 2019

a - это массив с 2 измерениями v - это массив с 3 измерениями, данные - это массив с 4 измерениями

Когда вы получаете доступ к 3-мерному массиву с 2-мерным массивом, вы добавляете в него одно измерение.

Представьте, что для каждой точки в трехмерном пространстве вы применяете двухмерное пространство, это добавит другое измерение в трехмерное пространство.Создание большего 4-мерного пространства.

Это только мое предположение, но я на самом деле противоположность эксперта, так что ответьте мне с долей соли, ха-ха!

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