したがって、次の方法でコードのパフォーマンスを大幅に向上させることができます。
ループを排除します。と
削除操作(元の配列のコピーが発生する)を回避する
NumPy 1.7では、元のマスクよりもはるかに使いやすい新しいマスクが導入されました。NumPyコア配列オブジェクトの一部であるため、パフォーマンスも大幅に向上します。これを使用することで、コストのかかる削除操作を回避できるため、これは便利な場合があると思います。
つまり、不要な配列要素を削除するのではなく、マスクするだけです。これは他の回答で提案されていますが、私は新しいマスクを使用することを提案しています
NAを使用するには、NAをインポートするだけです
>>> from numpy import NA as NA
次に、特定の配列に対して、masknaフラグをTrueに設定します
>>> A.flags.maskna = True
または、ほとんどの配列コンストラクター(1.7以降)にはパラメーターmasknaがあり、これをTrueに設定できます。
>>> A[3,3] = NA
array([[7, 5, 4, 8, 4],
[2, 4, 3, 7, 3],
[3, 1, 3, 2, 1],
[8, 2, 0, NA, 7],
[0, 7, 2, 5, 5],
[5, 4, 2, 7, 4],
[1, 2, 9, 2, 3],
[7, 5, 1, 2, 9]])
>>> A.sum(axis=0)
array([33, 30, 24, NA, 36])
多くの場合、これはあなたが望むものではありません-つまり、NAが0であるかのように扱われるその列の合計が必要です:
その動作を取得するには、skipmaパラメーターにTrueを渡します(ほとんどのNumPy配列コンストラクターにはNumPy 1.7でこのパラメーターがあります)。
>>> A.sum(axis=0, skipna=True)
array([33, 30, 24, 33, 36])
つまり、コードを高速化するには、ループを削除して新しいマスクを使用します。
>>> A[(A<=3)&(A<=6)] = NA
>>> A
array([[8, 8, 4, NA, NA],
[7, 9, NA, NA, 8],
[NA, 6, 9, 5, NA],
[9, 4, 6, 6, 5],
[NA, 6, 8, NA, NA],
[8, 5, 7, 7, NA],
[NA, 4, 5, 9, 9],
[NA, 8, NA, 5, 9]])
NAプレースホルダーは、このコンテキストでは0のように動作します。これは、あなたが望むものであると私は信じています。
>>> A.sum(axis=0, skipna=True)
array([32, 50, 39, 32, 31])