【问题标题】:How do I remove the first and last rows and columns from a 2D numpy array?如何从 2D numpy 数组中删除第一行和最后一行和列?
【发布时间】:2015-05-24 10:35:37
【问题描述】:

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

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

Numpy 中的等效代码是什么?我认为np.reshape 可能会做我想做的事,但我不确定如何让它只删除目标行,因为我认为如果我重塑为(N-1) x (N-1) 矩阵,它将删除最后两行和列.

【问题讨论】:

    标签: python matlab numpy matrix


    【解决方案1】:

    这个怎么样?

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

    1:-1 范围意味着我们从第二个索引或1 访问元素,并且我们向上到倒数第二个索引,如维度的-1 所示。我们独立地为这两个维度执行此操作。当您对两个维度独立执行此操作时,结果是您访问每个维度的方式的交集,这实际上是切断了第一行、第一列、最后一行和最后一列。

    请记住,结束索引是排他性的,所以如果我们以0:3 为例,我们只会得到一个维度的前三个元素,而不是四个。

    此外,负索引意味着我们从 end 访问数组。 -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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多