首页 > 编程知识 正文

python求数组最小值和最大值,python数组最大值索引

时间:2023-05-05 00:42:21 阅读:22018 作者:4322

我有一个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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。