Как работает этот код индексации? - PullRequest
2 голосов
/ 06 мая 2019

Я изучаю NumPy Framework. Этот кусок кода я не понимаю.

import numpy as np
a =np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print(a)
row = np.array([[0,0],[3,3]])
col = np.array([[0,2],[0,2]])
b = a[row,col]
print("This is b array:",b)

Этот массив b возвращает значения углов массива a, то есть b равно [[0,2],[9,11]].

Ответы [ 4 ]

4 голосов
/ 06 мая 2019

Когда индексация выполняется с использованием массива или «подобного массиву» для доступа / изменения элементов массива, это называется расширенной индексацией.

In [37]: a
Out[37]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

In [38]: row
Out[38]: 
array([[0, 0],
       [3, 3]])

In [39]: col
Out[39]: 
array([[0, 2],
       [0, 2]])

In [40]: a[row, col]
Out[40]: 
array([[ 0,  2],
       [ 9, 11]])

Это то, что вы получили.Ниже приводится объяснение:

              Indices of  
`a[row, col]` row  column  
   ||   ||    ||   ||
   VV   VV    VV   VV
  a[0,  0]   a[0,  2]   
  a[3,  0]   a[3,  2]
    |__________|   |
   row-idx array   |
        |__________| 
        column-idx array
2 голосов
/ 06 мая 2019

Вы индексируете a, используя два одинаковых по форме 2d-arrays, следовательно, ваш выходной массив также будет иметь ту же форму, что и col и row. Чтобы лучше понять, как работает array indexing, вы можете проверить документы , где, как показано, индексирование с помощью 1d-arrays по существующей оси данного массива работает следующим образом:

результат [i_1, ..., i_M] == x [ind_1 [i_1, ..., i_M], ind_2 [i_1, ..., i_M], ..., ind_N [i_1, ..., i_M]]

Если та же логика применяется в случае индексации с 2d-arrays по каждой оси, но вместо этого у вас будет массив result с до i_N_M индексами.

Итак, возвращаясь к своему примеру, вы выбираете из строк a на основе row, а из этих rows вы выбираете несколько столбцов col. Возможно, вам будет удобнее переводить индексы строк и столбцов в (x,y) координаты:

(0,0), (0,2)   
(3,0), (3,2)   

Что, в результате соответствующего выбора из a, приводит к массиву вывода:

print(a[row,col])

array([[ 0,  2],
       [ 9, 11]])
0 голосов
/ 06 мая 2019

По шагам:

import numpy as np
a = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])

print(a)

дает 2d массив a:

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

Тогда:

row = np.array([[0,0],[3,3]])

присваивает 2d массиву row значения [0,0] и [3,3]:

array([[0, 0],
       [3, 3]])

Тогда:

col = np.array([[0,2],[0,2]])

присваивает 2d массиву col значения [0,2] и [0,2]:

array([[0, 2],
       [0, 2]])

Наконец:

b = a[row,col]

присваивает b значения, заданные a[0,0], a[0,2] для первого ряда, a[3,0], a[3,2] для второго ряда, то есть:

 array([[ 0,  2],
       [ 9, 11]])

Откуда b[0,0] <- <code>a[0,0]? Это происходит от комбинации row[0,0], которая равна 0, и col[0,0], которая равна 0.

А как насчет b[0,1] <- <code>a[0,2]? Это происходит от комбинации row[0,1], которая равна 0, и col[0,1], которая равна 2.

и т. Д.

0 голосов
/ 06 мая 2019

Вы можете понять это, сделав больше попыток, чтобы увидеть больше примеров.

Если у вас есть одномерный индекс:

In [58]: np.arange(10)[np.array([1,3,4,6])]
Out[58]: array([1, 3, 4, 6])

В случае двумерного индекса:

In [57]: np.arange(10)[np.array([[1,3],[4,6]])]
Out[57]: 
array([[1, 3],
       [4, 6]])

Если вы используете 3-х мерный индекс:

In [59]: np.arange(10)[np.array([[[1],[3]],[[4],[6]]])]
Out[59]: 
array([[[1],
        [3]],

       [[4],
        [6]]])

Как видите, если вы создадите иерархию в индексировании, вы получите ее и в выходных данных.

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