Vì bạn thực sự muốn một mảng khác nhau arrở đâu arr < 255, và 255nếu không, điều này có thể được thực hiện đơn giản:
result = np.minimum(arr, 255)
Tổng quát hơn, cho giới hạn dưới và / hoặc trên:
result = np.clip(arr, 0, 255)
Nếu bạn chỉ muốn truy cập các giá trị trên 255 hoặc một cái gì đó phức tạp hơn, câu trả lời của @ mtitan8 thì chung chung hơn, np.clipvà np.minimum(hoặc np.maximum) đẹp hơn và nhanh hơn cho trường hợp của bạn:
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
Nếu bạn muốn thực hiện tại chỗ (nghĩa là sửa đổi arrthay vì tạo result), bạn có thể sử dụng outtham số của np.minimum:
np.minimum(arr, 255, out=arr)
hoặc là
np.clip(arr, 0, 255, arr)
( out=tên là tùy chọn vì các đối số theo cùng thứ tự với định nghĩa của hàm.)
Để sửa đổi tại chỗ, lập chỉ mục boolean tăng tốc rất nhiều (không cần phải thực hiện và sau đó sửa đổi bản sao riêng biệt), nhưng vẫn không nhanh như 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
Để so sánh, nếu bạn muốn hạn chế các giá trị của mình ở mức tối thiểu cũng như tối đa, nếu không clipbạn sẽ phải làm điều này hai lần, với một cái gì đó như
np.minimum(a, 255, a)
np.maximum(a, 0, a)
hoặc là,
a[a>255] = 255
a[a<0] = 0