web-dev-qa-db-ja.com

2D numpy配列から最初と最後の行と列を削除するにはどうすればよいですか?

Numpyで2D配列から最初と最後の行と列を削除する方法を知りたいです。たとえば、(N+1) x (N+1)マトリックスはHと呼ばれ、MATLAB/Octaveで使用するコードは次のようになります。

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

Numpyの同等のコードは何ですか? np.reshape は私が望むことをするかもしれませんが、私が(N-1) x (N-1)マトリックス。最後の2つの行と列を削除します。

9
BH2017

これはどう?

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

1:-1の範囲は、2番目のインデックスまたは1から要素にアクセスし、ディメンションの-1で示されているように、最後から2番目のインデックスに移動することを意味します。これは、両方の次元で個別に行います。これを両方のディメンションに対して独立して行うと、結果は各ディメンションへのアクセス方法の共通部分になり、基本的に最初の行、最初の列、最後の行、最後の列が切り取られます。

終了インデックスはexclusiveであることを忘れないでください。たとえば、0:3を実行した場合、ディメンションの最初の要素のみが取得され、4つは取得されません。

また、負のインデックスはendから配列にアクセスすることを意味します。 -1は、特定の次元でアクセスする最後の値ですが、排他性のため、最後の要素ではなく、2番目の最後の要素に到達しています。基本的に、これは以下と同じです。

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に配置されています。