如何从2D numpy数组中删除第一行和最后一行和列?

时间:2015-03-20 21:49:23

标签: python matlab numpy matrix

我想知道如何从numpy中的2D数组中删除第一行和最后一行和列。例如,假设我们有一个名为(N+1) x (N+1)的{​​{1}}矩阵,那么在MATLAB / Octave中,我使用的代码将是:

H

Numpy中的等效代码是什么?我认为np.reshape可能会做我想要的但我不知道如何让它只删除目标行,因为我认为如果我重塑为Hsub = H(2:N,2:N); 矩阵,它将删除最后一行两行和两列。

1 个答案:

答案 0 :(得分:16)

这个怎么样?

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中。