1. ホーム
  2. python

[解決済み] NumPyの2次元配列のスライス、またはnxn配列(n>m)からmxmの部分行列を取り出すには?

2022-05-03 16:54:27

質問

NumPy の nxn 配列をスライスしたい。私は 任意 その配列の m 個の行と列を選択して(つまり、行数/列数にパターンがない状態で)、新しい mxm 配列を作成します。この例では、配列が 4x4 で、そこから 2x2 の配列を取り出すとします。

これがその配列です。

from numpy import *
x = range(16)
x = reshape(x,(4,4))

print x
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

削除する行と列は同じです。最も簡単なケースは、先頭または末尾にある2x2部分行列を抽出したい場合、つまり :

In [33]: x[0:2,0:2]
Out[33]: 
array([[0, 1],
       [4, 5]])

In [34]: x[2:,2:]
Out[34]: 
array([[10, 11],
       [14, 15]])

しかし、別の行/列の混合を削除する必要がある場合はどうでしょうか?1行目と3行目を削除し,サブマトリクスを抽出する必要がある場合はどうでしょうか? [[5,7],[13,15]] ? 行・列の構成は自由です。行と列の両方のインデックスを持つ配列/リストを使用して配列のインデックスを作成する必要があるとどこかで読みましたが、それはうまくいかないようです。

In [35]: x[[1,3],[1,3]]
Out[35]: array([ 5, 15])

という、一つの方法を見つけました。

    In [61]: x[[1,3]][:,[1,3]]
Out[61]: 
array([[ 5,  7],
       [13, 15]])

これの最初の問題は、ほとんど読み取れないということです。もし誰かがもっと良い解決策を持っているなら、ぜひそれを聞きたいです。

もうひとつは、私が読んだ あるフォーラムで 配列で配列のインデックスを作成すると、NumPy は目的の配列のコピーを作成することになるため、大きな配列を扱う場合には問題になる可能性があるということです。なぜそうなのでしょうか、また、このメカニズムはどのように機能するのでしょうか?

解決方法は?

スヴェンさんのおっしゃるとおりです。 x[[[0],[2]],[1,3]] は 1 と 3 の列と一致する 0 と 2 の行を返します。 x[[0,2],[1,3]] は、値 x[0,1] と x[2,3] を配列で返します。

最初にあげたようなことをするのに便利な関数があります。 numpy.ix_ . で最初の例と同じことができます。 x[numpy.ix_([0,2],[1,3])] . これによって、余分な括弧を入力する手間を省くことができます。