Dado que realmente desea una matriz diferente que es arr
donde arr < 255
, y de lo 255
contrario, esto puede hacerse simplemente:
result = np.minimum(arr, 255)
Más generalmente, para un límite inferior y / o superior:
result = np.clip(arr, 0, 255)
Si solo desea acceder a los valores superiores a 255, o algo más complicado, la respuesta de @ mtitan8 es más general, pero np.clip
y np.minimum
(o np.maximum
) son más agradables y más rápidos para su caso:
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
Si desea hacerlo en el lugar (es decir, modificar en arr
lugar de crear result
) puede usar el out
parámetro de np.minimum
:
np.minimum(arr, 255, out=arr)
o
np.clip(arr, 0, 255, arr)
(el out=
nombre es opcional ya que los argumentos están en el mismo orden que la definición de la función).
Para la modificación en el lugar, la indexación booleana se acelera mucho (sin tener que hacer y luego modificar la copia por separado), pero aún no es tan rápido como 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
A modo de comparación, si quisiera restringir sus valores con un mínimo y un máximo, sin clip
tener que hacer esto dos veces, con algo como
np.minimum(a, 255, a)
np.maximum(a, 0, a)
o,
a[a>255] = 255
a[a<0] = 0