查看: 2361|回复: 0

Python替换NumPy数组中大于某个值的所有元素

[复制链接]

166

主题

616

帖子

1万

积分

xdtech

Rank: 5Rank: 5

积分
11584
发表于 2019-2-27 23:13:47 | 显示全部楼层 |阅读模式
我有一个2D(二维) NumPy数组,并希望用255.0替换大于或等于阈值T的所有值。据我所知,最基础的方法是:


  • shape = arr.shape



  • result = np.zeros(shape)



  • for x in range(0, shape[0]):



  •     for y in range(0, shape[1]):



  •         if arr[x, y] >= T:



  •             result[x, y] = 255


  • 有更简洁和pythonic的方式来做到这一点吗?

  • 有没有更快(可能不那么简洁和/或不那么pythonic)的方式来做到这一点?

    最佳解决思路

    我认为最快和最简洁的方法是使用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]: 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


    如果要执行in-place(即修改arr而不是创建result),则可以使用np.minimum的out参数:

    np.minimum(arr, 255, out=arr)

    或者

    np.clip(arr, 0, 255, arr)

    (out=名称是可选的,因为参数的顺序与函数的定义相同。)



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表