Puisque vous voulez en fait un tableau différent qui soit arr
où arr < 255
, et 255
sinon, cela peut être fait simplement:
result = np.minimum(arr, 255)
Plus généralement, pour une borne inférieure et / ou supérieure:
result = np.clip(arr, 0, 255)
Si vous souhaitez simplement accéder aux valeurs supérieures à 255, ou à quelque chose de plus compliqué, la réponse de @ mtitan8 est plus générale, mais np.clip
et np.minimum
(ou np.maximum
) sont plus agréables et beaucoup plus rapides pour votre cas:
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 vous voulez le faire sur place (c'est-à-dire modifier arr
au lieu de créer result
), vous pouvez utiliser le out
paramètre de np.minimum
:
np.minimum(arr, 255, out=arr)
ou
np.clip(arr, 0, 255, arr)
(le out=
nom est facultatif car les arguments sont dans le même ordre que la définition de la fonction.)
Pour la modification sur place, l'indexation booléenne accélère beaucoup (sans avoir à faire puis modifier la copie séparément), mais n'est toujours pas aussi rapide que 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
À titre de comparaison, si vous vouliez restreindre vos valeurs avec un minimum ainsi qu'un maximum, sans clip
vous auriez à le faire deux fois, avec quelque chose comme
np.minimum(a, 255, a)
np.maximum(a, 0, a)
ou,
a[a>255] = 255
a[a<0] = 0