Как удалить первую и последнюю строки и столбцы из массива 2D numpy?

Я хотел бы знать, как удалить первые и последние строки и столбцы из 2D-массива в numpy. Например, скажем, у нас есть (N+1) x (N+1) матрица называется H тогда в MATLAB/Octave код, который я бы использовал, будет:

Hsub = H(2:N,2:N);

каков эквивалентный код в Numpy? Я так и думал!--8-->np.reshape может делать то, что я хочу, но я не уверен, как заставить его удалить только целевые строки, как я думаю, если я изменю форму на (N-1) x (N-1) matrix, он удалит последние две строки и столбцы.

1 ответов


как насчет этого?

Hsub = H[1:-1, 1:-1]

на 1:-1 диапазон означает, что мы получаем доступ к элементам из второго индекса или 1, и мы идем ко второму последнему индексу, как указано -1 для измерения. Мы делаем это для обоих направлениях независимо. Когда вы делаете это независимо для обоих измерений, результатом является пересечение того, как вы обращаетесь к каждому измерению, которое по существу отсекает первую строку, первый столбец, последнюю строку и последнюю колонна.

помните, что конечный индекс является эксклюзивные, так что если бы мы сделали 0:3 например, мы получаем только первый три элементы измерения, а не четыре.

кроме того, отрицательные индексы означают, что мы получаем доступ к массиву из конец. -1 является последним значением для доступа в определенном измерении, но из-за исключительности мы переходим ко второму последнему элементу, а не к последнему элементу. По существу, это то же самое, что делать:

Hsub = H[1:H.shape[0]-1, 1:H.shape[1]-1]

... но использование отрицательных индексов гораздо элегантнее. Вам также не нужно использовать количество строк и столбцов для извлечения того, что вам нужно. Приведенный выше синтаксис является агностическим. Однако вам нужно убедиться, что матрица по крайней мере 3 x 3, или вы получите ошибку.

небольшой бонус

в MATLAB / Octave вы можете достичь того же самого, не используя размеры:

Hsub = H(2:end-1, 2:end-1);

на end ключевое слово в отношении индексирования означает получить последний элемент для определенного измерения.

пример использования

вот пример (с использованием IPython):

In [1]: import numpy as np

In [2]: H = np.meshgrid(np.arange(5), np.arange(5))[0]

In [3]: H
Out[3]: 
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])

In [4]: Hsub = H[1:-1,1:-1]

In [5]: Hsub
Out[5]: 
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

как вы можете видеть, первая строка, первый столбец, последняя строка и последний столбец были удалены из исходной матрицы H и остаток был помещен в выходную матрицу Hsub.