Оскільки ви насправді хочете отримати інший масив, який є arr
де 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
вам не доведеться це робити двічі, з чимось на зразок
np.minimum(a, 255, a)
np.maximum(a, 0, a)
або,
a[a>255] = 255
a[a<0] = 0