Индекс питона в 2d матрице

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

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

Мое понимание было следующие строки идентичны:

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

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

3 ответа

Решение

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

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

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

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

mat[:3].shape       # (3, 5)
mat[:3][1:2].shape  # (1, 5)
mat[:3,1:2].shape   # (3, 1)

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

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]

Вот почему:

> 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]])
Другие вопросы по тегам