เนื่องจากคุณต้องการอาร์เรย์ที่แตกต่างกันซึ่งเป็นarr
ที่arr < 255
และ255
อื่น ๆ สิ่งนี้สามารถทำได้ง่ายๆ:
result = np.minimum(arr, 255)
โดยทั่วไปแล้วสำหรับขอบล่างและ / หรือบน:
result = np.clip(arr, 0, 255)
หากคุณต้องการเข้าถึงค่าที่มากกว่า 255 หรือสิ่งที่ซับซ้อนกว่านี้คำตอบของ @ mtitan8 นั้นกว้างกว่า แต่np.clip
และnp.minimum
(หรือnp.maximum
) นั้นดีกว่าและเร็วกว่ามากสำหรับกรณีของคุณ:
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
หากคุณต้องการที่จะทำมันในสถานที่ (เช่นแก้ไขarr
แทนการสร้างresult
) คุณสามารถใช้out
พารามิเตอร์ของnp.minimum
:
np.minimum(arr, 255, out=arr)
หรือ
np.clip(arr, 0, 255, arr)
( out=
ชื่อเป็นทางเลือกเนื่องจากอาร์กิวเมนต์ในลำดับเดียวกันกับนิยามของฟังก์ชัน)
สำหรับการปรับเปลี่ยนในสถานที่การทำดัชนีบูลีนจะเพิ่มความเร็วขึ้นมาก (โดยไม่ต้องสร้างและแก้ไขสำเนาแยกต่างหาก) แต่ก็ยังไม่เร็วเท่า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
สำหรับการเปรียบเทียบหากคุณต้องการ จำกัด ค่าของคุณด้วยค่าต่ำสุดและสูงสุดโดยไม่clip
ต้องทำสองครั้งด้วยสิ่งที่ชอบ
np.minimum(a, 255, a)
np.maximum(a, 0, a)
หรือ,
a[a>255] = 255
a[a<0] = 0