1. ホーム
  2. パイソン

[解決済み】Python NumPyの配列のうち、ある値より大きい要素をすべて置き換える。

2022-04-04 01:35:01

質問

私は2DのNumPy配列を持っており、その中の閾値T以上の値をすべて255.0に置き換えたいと考えています。私の知る限り、最も基本的な方法は、次のようになります。

shape = arr.shape
result = np.zeros(shape)
for x in range(0, shape[0]):
    for y in range(0, shape[1]):
        if arr[x, y] >= T:
            result[x, y] = 255

  1. これを行うための最も簡潔でパイソン的な方法は何ですか?

  2. より高速な(おそらくより簡潔で、かつ/またはよりPythonicでない)方法はありますか?

これは、人間の頭のMRIスキャン用のウィンドウ/レベル調整サブルーチンの一部になる。2次元のnumpy配列は、画像のピクセルデータです。

どのように解決するの?

これを行うには、NumPy の組み込みの Fancy indexing を使うのが最も速く、かつ最も簡潔な方法だと思います。もし、あなたが ndarray という名前の arr であれば、すべての要素を置き換えることができます。 >255 という値で x を以下のように設定します。

arr[arr > 255] = x

私のマシンでは、500×500のランダム行列で、すべての値 >0.5 を 5 に置き換えて実行したところ、平均7.59msかかりました。

In [1]: import numpy as np
In [2]: A = np.random.rand(500, 500)
In [3]: timeit A[A > 0.5] = 5
100 loops, best of 3: 7.59 ms per loop