NumPy で 2D アレイをスライスする

Muhammad Maisam Abbas 2023年1月30日
  1. NumPy で配列インデックスを使用して 2D 配列をスライスする
  2. NumPy の numpy.ix_() 関数を使用して 2D 配列をスライスする
NumPy で 2D アレイをスライスする

このチュートリアルでは、NumPy で 2D 配列をスライスする方法を紹介します。

NumPy で配列インデックスを使用して 2D 配列をスライスする

メインの 2DNumPy 配列があり、そこから別の 2D サブ配列を抽出する場合は、この目的で配列インデックス作成方法を使用できます。この例では、4*4 の形状の配列を考えてみましょう。配列の最初と最後の要素を抽出するのは非常に簡単です。たとえば、array[0:2,0:2] は、配列内の最初の 2つの要素を垂直方向と水平方向の両方に含むビューまたはサブ配列を提供します。同様に、array[2:,2:] は、配列内の最後の 2つの要素を垂直方向と水平方向の両方に含むビューまたはサブ配列を提供します。より複雑な作業は、中央の行または列をスキップして、異なる行および列から要素を取得することです。次のコード例は、Python の配列インデックスを使用してこれを実現する方法を正確に示しています。

import numpy as np

x = range(16)

x = np.reshape(x, (4, 4))
print(x)

y = x[[[0], [2]], [1, 3]]
print(y)

出力:

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

上記のコードでは、Python の配列インデックスメソッドを使用して行 2 と列 2 をスキップしながら、列 1 と 3 と交差する行 1 と 3 の要素を抽出しました。これは、以下のコーディング例に示すように、同様のアプローチで実行できますが、構文が異なります。

import numpy as np

x = range(16)

x = np.reshape(x, (4, 4))
print(x)

y = x[0::2, 1::2]
print(y)

出力:

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

上記のコードでは、Python の配列インデックスメソッドを使用して行 2 と列 2 をスキップしながら、列 1 と 3 と交差する行 1 と 3 の要素も抽出しました。この方法は、角かっこが多すぎず、全体的に読みやすいため、以前のアプローチよりも簡単です。

NumPy の numpy.ix_() 関数を使用して 2D 配列をスライスする

numpy.ix_() 関数は、Python で要素のオープンメッシュフォームシーケンスを形成します。この関数は n 1D 配列を受け取り、nD 配列を返します。この関数を使用して、メイン配列から個々の 1D スライスを抽出し、それらを組み合わせて 2D 配列を形成できます。次のコード例は、前の例と同じ仕事をしますが、Python の配列インデックスで numpy.ix_() 関数を使用します。

import numpy as np

x = range(16)

x = np.reshape(x, (4, 4))
print(x)

y = x[np.ix_([0, 2], [1, 3])]
print(y)

出力:

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

上記のコードでは、基本的に前の例とまったく同じことを行いましたが、Python で配列のインデックス付けとともに np.ix_() 関数を使用しました。

これらすべての例の背後にある主な考え方は同じです。メイン配列を作成したとき、その形状とサイズに応じてバッファが割り当てられました。配列インデックスメソッドは、メイン配列のメモリバッファを指す配列データ型の新しいオブジェクトを作成します。上記のすべての例では、y は新しい配列ですが、メモリ内のバッファを使用しません。配列 x のメモリバッファ上の特定の場所のみを指します。これが、単に新しい配列を作成するよりも、配列のインデックス作成方法を改善する理由です。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn