индекс python в 2d-матрице

Учитывая следующий код:

import numpy as np
mat = np.arange(1,26).reshape(5,5)

Насколько я понял, следующие строки идентичны:

mat[:3][1:2]
mat[:3,1:2]

Но это не так. Почему?


person R71    schedule 14.06.2018    source источник
comment
mat[x][y] совпадает с mat[x, y], только если x является скаляром, т. е. если он выбирает один элемент в первом измерении.   -  person hpaulj    schedule 14.06.2018


Ответы (3)


Если вы укажете только одно измерение в синтаксисе среза, будет срезано только одно измерение. В NumPy измерения при индексации обычно разделяются ",".

Для двумерного массива вы можете заменить «строку» на «размерность 1» и «столбец» на «размерность 2». В вашем примере mat[:3] нарезает первые 3 строки. Последующий индексатор [1:2] нарезает первую из этих трех строк.

Во втором примере [:3, 1:2] разрезает строки и столбцы одновременно.

Возможно, вам будет полезно взглянуть на формы ваших результатов:

mat[:3].shape       # (3, 5)
mat[:3][1:2].shape  # (1, 5)
mat[:3,1:2].shape   # (3, 1)
person jpp    schedule 14.06.2018

Ваша матрица:

array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20],
       [21, 22, 23, 24, 25]])

Первый mat[:3][1:2] сначала возьмет mat[:3], а затем применит [1:2]:

mat[:3]
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15]])
# mat[:3][1:2] => array([[ 6,  7,  8,  9, 10]])

В то время как второй (mat[:3,1:2]) гласит:

линии до 3

array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15]])

Столбцы с 1 по 2

 array([[ 2],
       [ 7],
       [12]])

Вывод, основное отличие в том, что первый применяет [1:2] после [:3]

person Mathieu    schedule 14.06.2018

Вот почему:

> mat

# output:
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20],
       [21, 22, 23, 24, 25]])

> mat[:3] # you are selecting the first 3 rows

#output:
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15]])

> mat[:3][1:2] # you are selecting the second row only

Output:
array([[ 6,  7,  8,  9, 10]])

> mat[:3,1:2] # you are selecting from the first 3 rows and the second column

Output:
array([[ 2],
       [ 7],
       [12]])
person J. Snow    schedule 14.06.2018