ホームページ >バックエンド開発 >Python チュートリアル >NumPy 配列から指定されたストライドでサブ配列を効率的に抽出する方法は?

NumPy 配列から指定されたストライドでサブ配列を効率的に抽出する方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-09 21:18:10830ブラウズ

How to Efficiently Extract Subarrays with a Given Stride from a NumPy Array?

指定されたストライド/ステップサイズで Numpy 配列からサブ配列を効率的に取得する

データ分析の世界では、多くの場合、特定のストライド/ステップサイズでサブ配列を抽出する必要があります。より大きな配列からのストライドまたはステップサイズ。数値演算用の人気のある Python ライブラリである Numpy は、これを効率的に実現するためのメソッドをいくつか提供しています。

問題ステートメント:
Numpy 配列が与えられた場合、次の部分配列の行列を抽出したいと考えています。特定のストライドまたはステップサイズの固定長。ストライドは、連続するサブ配列の先頭間の距離です。

ディスカッション:

サブ配列を作成する簡単な方法の 1 つは、for ループを使用して元の配列を反復処理することです。 。このアプローチは機能しますが、大きな配列の場合は遅くなる可能性があります。

アプローチ 1: ブロードキャスト

NumPy のブロードキャスト メカニズムを使用すると、ループなしでサブ配列を作成できます。配列、部分配列の長さ (L)、およびストライド (S) を受け取る次の関数を使用できます。

def broadcasting_app(a, L, S):
    nrows = ((a.size - L) // S) + 1
    return a[S * np.arange(nrows)[:, None] + np.arange(L)]

説明:
np.arange(nrows) は、ストライドが 1 のインデックスの配列。これに S を乗算すると、各部分配列の開始インデックスが得られます。次に、これらのインデックスを a の行全体にブロードキャストして、部分配列を取得します。

アプローチ 2: NumPy ストライド

もう 1 つの効率的な方法は、NumPy のストライド機能を使用します。ストライドは、各軸に沿った連続する要素間のバイト数を表します。この情報を使用して部分配列を作成できます:

def strided_app(a, L, S):
    nrows = ((a.size - L) // S) + 1
    n = a.strides[0]
    return np.lib.stride_tricks.as_strided(a, shape=(nrows, L), strides=(S * n, n))

説明:
np.lib.stride_tricks.as_strided を使用して、ストライドを利用して a を再形成します。結果の配列には、S のストライドを維持しながら、必要な行数 (nrows) と部分配列の長さ (L) が含まれます。

サンプル コード:

アプローチ:

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

print(broadcasting_app(a, L=5, S=3))
print(strided_app(a, L=5, S=3))

出力:

[[ 1  2  3  4  5]
 [ 4  5  6  7  8]
 [ 7  8  9 10 11]]
[[ 1  2  3  4  5]
 [ 4  5  6  7  8]
 [ 7  8  9 10 11]]

どちらのアプローチも、目的のストライドを持つ部分配列の行列を効率的に生成します。

以上がNumPy 配列から指定されたストライドでサブ配列を効率的に抽出する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。