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つの行と列を削除します。
これはどう?
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
に配置されています。