Da Sie tatsächlich ein anderes Array wünschen, arr
wo arr < 255
und 255
ansonsten, kann dies einfach durchgeführt werden:
result = np.minimum(arr, 255)
Allgemeiner für eine Unter- und / oder Obergrenze:
result = np.clip(arr, 0, 255)
Wenn Sie nur auf Werte über 255 oder etwas Komplizierteres zugreifen möchten, ist die Antwort von @ mtitan8 allgemeiner, aber np.clip
und np.minimum
(oder np.maximum
) sind für Ihren Fall schöner und viel schneller:
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
Wenn Sie dies direkt tun möchten (dh ändern arr
statt erstellen result
), können Sie den folgenden out
Parameter verwenden np.minimum
:
np.minimum(arr, 255, out=arr)
oder
np.clip(arr, 0, 255, arr)
(Der out=
Name ist optional, da die Argumente in derselben Reihenfolge wie die Definition der Funktion vorliegen.)
Bei direkten Änderungen beschleunigt sich die boolesche Indizierung erheblich (ohne dass die Kopie separat erstellt und anschließend geändert werden muss), ist jedoch immer noch nicht so schnell wie 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
Zum Vergleich, wenn Sie Ihre Werte sowohl auf ein Minimum als auch auf ein Maximum beschränken clip
möchten , ohne dass Sie dies zweimal tun müssten, mit so etwas wie
np.minimum(a, 255, a)
np.maximum(a, 0, a)
oder,
a[a>255] = 255
a[a<0] = 0