我有一个2d (二维) NumPy数组,希望用255.0替换所有大于或等于阈值t的值。 据我所知,最基础的方法是:
shape=arr.shape
result=NP.Zeros(shape )
forxinrange(0,shape )0) ) :
foryinrange(0,shape )1) ) :
if arr[x,y]=T:
result[x,y]=255
有更简洁、更pythonic的方法吗?
为了实现这一点,是否可能更快和/或不是pythonic?
它将成为人体头颅MRI扫描窗口/电平调整子程序的一部分,2D numpy排列是图像像素数据。
一方面,我认为最佳的解决方案是,最快、最简洁的方法是使用Numpy的内置索引。 如果存在名为arr的ndarray,则可以将所有元素255替换为值x,如下所示:
arr[arr 255]=x
我在我的机器上以500 x 500的随机矩阵运行这个函数,用5替换了所有0.5的值。 平均需要7.59ms。
In [1]: import numpy as np
in [2] : a=NP.random.rand (500,500 ) )。
In [3]: timeit A[A 0.5]=5
100 loops,best of 3: 7.59 ms per loop
二、次佳解决思路实际需要不同的序列、arr,其中arr 255,很容易完成:
result=NP.minimum(ARR,255 ) ) ) ) ) ) ) )。
更一般地,关于下限和/或上限:
result=NP.clip(ARR,0,255 ) )。
如果您只是想访问超过255个值,np.clip和np.minimum (或np.maximum )对您的情况更好更快。
in[292]:timeitNP.minimum(a,255 ) )。
100000 loops,best of 3: 19.6 s per loop
In [293]: %%timeit
.c=NP.copy(a ) ) )。
. c[a255]=255
.
10000 loops,best of 3: 86.6 s per loop
如果要执行在位,也就是修改arr而不是创建result,则可以使用np.minimum的out参数。
NP.minimum(arr,255,out=arr ) ) ) ) ) ) ) )。
或者
NP.clip(arr,0,255,arr ) )。
(out=名称是可选的,因为参数的顺序与函数的定义相同。 )
在in-place更改中,布尔索引速度大大提高,但不需要单独修改和复制。 比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[a255]=255
.
100000 loops,best of 3: 356 s per loop
比较而言,如果想要限制最大值和最小值,如果没有剪辑,则必须执行以下两次
NP.minimum(a,255,a ) ) ) ) )。
NP.maximum(a,0,a ) ) )。
或者,
a[a255]=255
a[a0]=0
三、第三个解决方案可以通过使用where功能达到最快:
例如,在numpy数组中查找大于0.2的项目,并将它们替换为0。
import numpy as np
nums=NP.random.rand (4,3 ) ) ) ) ) ) ) )。
打印NP.where (NUMS 0.2,0,nums ) )。
四、第四构想NP.putmask(ARR,arr=T,255.0 ) ) ) ) ) ) ) ) )。
以下是与Numpy内置索引的性能比较:
In [1]: import numpy as np
in [2] : a=NP.random.rand (500,500 ) )。
in[3]:timeitNP.putmask(a,a 0.5,5 ) ) )。
1000 loops,best of 3: 1.34 ms per loop
In [4]: timeit A[A 0.5]=5
1000 loops,best of 3: 1.82 ms per loop