由于您实际上想要一个不同的数组arr
where arr < 255
,255
否则,这可以简单地完成:
result = np.minimum(arr, 255)
更一般地,对于下限和/或上限:
result = np.clip(arr, 0, 255)
如果您只想访问超过 255 的值或更复杂的值,@mtitan8 的答案更笼统,但np.clip
and np.minimum
(or 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