Как удалить первую и последнюю строки и столбцы из массива 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
.