ホームページ >バックエンド開発 >Python チュートリアル >NumPy のベクトル化関数はどのようにして効率的に配列を正当化できるのでしょうか?
NumPy は、ベクトル化関数を使用して配列を位置合わせする効率的な方法を提供し、従来の Python ループと比較してパフォーマンスとコードの簡素化が向上します。
与えられたNumPy 配列のタスクは、その形状を維持しながら、非ゼロ要素を左、右、上、または下にシフトすることです。
次の NumPy 実装は、効率的な位置揃えを実行します。
import numpy as np def justify(a, invalid_val=0, axis=1, side='left'): if invalid_val is np.nan: mask = ~np.isnan(a) else: mask = a!=invalid_val justified_mask = np.sort(mask,axis=axis) if (side=='up') | (side=='left'): justified_mask = np.flip(justified_mask,axis=axis) out = np.full(a.shape, invalid_val) if axis==1: out[justified_mask] = a[mask] else: out.T[justified_mask.T] = a.T[mask.T] return out
この関数は、指定された軸と辺 (左、右、上、下) に沿って 2D 配列を揃えます。この機能は、マスクを使用してゼロ以外の要素を識別し、ソートを使用してそれらを並べ替え、上または左に揃える場合はマスクを反転し、最後に揃えられた値で元の配列を上書きします。
以下は、ゼロ以外の要素をカバーする使用例です。左:
a = np.array([[1,0,2,0], [3,0,4,0], [5,0,6,0], [0,7,0,8]]) # Cover left covered_left = justify(a, axis=1, side='left') print("Original Array:") print(a) print("\nCovered Left:") print(covered_left)
出力:
Original Array: [[1 0 2 0] [3 0 4 0] [5 0 6 0] [0 7 0 8]] Covered Left: [[1 2 0 0] [3 4 0 0] [5 6 0 0] [7 8 0 0]]
N 次元配列の位置調整には、次の関数を使用できます。 :
def justify_nd(a, invalid_val, axis, side): pushax = lambda a: np.moveaxis(a, axis, -1) if invalid_val is np.nan: mask = ~np.isnan(a) else: mask = a!=invalid_val justified_mask = np.sort(mask,axis=axis) if side=='front': justified_mask = np.flip(justified_mask,axis=axis) out = np.full(a.shape, invalid_val) if (axis==-1) or (axis==a.ndim-1): out[justified_mask] = a[mask] else: pushax(out)[pushax(justified_mask)] = pushax(a)[pushax(mask)] return out
この関数は、N 次元配列を位置揃えすることで、より複雑なシナリオをサポートします。任意の軸と配列の「先頭」または「末尾」のいずれかに指定します。
以上がNumPy のベクトル化関数はどのようにして効率的に配列を正当化できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。