Vì bạn thực sự muốn một mảng khác nhau arr
ở đâu arr < 255
, và 255
nế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.clip
và 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 arr
thay vì tạo result
), bạn có thể sử dụng out
tham 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 clip
bạ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