実際にはarr
whereである別の配列が必要なのでarr < 255
、255
そうでなければ、これは簡単に行うことができます:
result = np.minimum(arr, 255)
より一般的には、下限および/または上限の場合:
result = np.clip(arr, 0, 255)
255を超える値やもっと複雑な値にアクセスしたいだけの場合は、@ mtitan8の答えがより一般的ですがnp.clip
、そしてnp.minimum
(またはnp.maximum
)はあなたの場合にはより優れており、はるかに高速です:
In [292]: timeit np.minimum(a, 255)
100000 loops, best of 3: 19.6 µs per loop
In [293]: %%timeit
.....: c = np.copy(a)
.....: c[a>255] = 255
.....:
10000 loops, best of 3: 86.6 µs per loop
これをインプレースで実行する場合(つまり、arr
を作成する代わりに変更する場合result
)は、次のout
パラメータを使用できますnp.minimum
。
np.minimum(arr, 255, out=arr)
または
np.clip(arr, 0, 255, arr)
(out=
引数は関数の定義と同じ順序なので、名前はオプションです。)
インプレース変更の場合、ブールインデックスは大幅に高速化されます(コピーを個別に作成して変更する必要はありません)。ただし、minimum
次のように高速ではありません。
In [328]: %%timeit
.....: a = np.random.randint(0, 300, (100,100))
.....: np.minimum(a, 255, a)
.....:
100000 loops, best of 3: 303 µs per loop
In [329]: %%timeit
.....: a = np.random.randint(0, 300, (100,100))
.....: a[a>255] = 255
.....:
100000 loops, best of 3: 356 µs per loop
比較のために、最小値と最大値で値を制限したい場合clip
は、これを2回行う必要はありません。
np.minimum(a, 255, a)
np.maximum(a, 0, a)
または、
a[a>255] = 255
a[a<0] = 0