Da Sie tatsächlich ein anderes Array wünschen, arrwo arr < 255und 255ansonsten, 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.clipund 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 arrstatt erstellen result), können Sie den folgenden outParameter 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 clipmö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