Индекс питона в 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]])