ホームページ >バックエンド開発 >Python チュートリアル >NumPy のベクトル化関数はどのようにして効率的に配列を正当化できるのでしょうか?

NumPy のベクトル化関数はどのようにして効率的に配列を正当化できるのでしょうか?

DDD
DDDオリジナル
2024-12-09 11:05:06276ブラウズ

How Can NumPy's Vectorized Functions Efficiently Justify Arrays?

ベクトル化関数を使用した NumPy 配列の位置合わせ

NumPy は、ベクトル化関数を使用して配列を位置合わせする効率的な方法を提供し、従来の Python ループと比較してパフォーマンスとコードの簡素化が向上します。

問題ステートメント

与えられたNumPy 配列のタスクは、その形状を維持しながら、非ゼロ要素を左、右、上、または下にシフトすることです。

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 次元配列の位置調整

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 サイトの他の関連記事を参照してください。

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