我有一个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)的方式来做到这一点?

这将成为人体头部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]: 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=名称是可选的,因为参数的顺序与函数的定义相同。)

对于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[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

第三种解决思路

可以通过使用where功能来达到最快的速度:

例如,在numpy数组中查找大于0.2的项目,并用0代替它们:

import numpy as np

nums = np.random.rand(4,3)

print np.where(nums > 0.2, 0, nums)

第四种思路

可以考虑使用numpy.putmask:

np.putmask(arr, arr>=T, 255.0)

下面是与Numpy内置索引的性能比较:

In [1]: import numpy as np

In [2]: A = np.random.rand(500, 500)

In [3]: timeit np.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

以上这篇Python替换NumPy数组中大于某个值的所有元素实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持聚米学院。

python取出数组大于某值_Python替换NumPy数组中大于某个值的所有元素实例相关推荐

  1. python试题for循环布尔值_Python自我修炼(升仙中....整数,布尔值,字符串,for循环)

    索引(下标) 索引就是下标,下标从0开始,取值时索引所选长度不可以超过其本身. s1 = "python学习" print(s1[0]) # 获取第0个索引所对应的的元素. pri ...

  2. python将大于输出列表_python找出列表中大于某个阈值的数据段示例

    该算法实现对列表中大于某个阈值(比如level=5)的连续数据段的提取,具体效果如下: 找出list里面大于5的连续数据段: list = [1,2,3,4,2,3,4,5,6,7,4,6,7,8,5 ...

  3. python遍历字符串数组_Python遍历numpy数组的实例

    Python遍历numpy数组的实例 在用python进行图像处理时,有时需要遍历numpy数组,下面是遍历数组的方法: [rows, cols] = num.shape for i in range ...

  4. python二维数组画出_python二维数组画图

    matplotlib机器学习常用绘图指令_计算机软件及应用_IT/计算机_专业资料.该文档介绍了python的matplotlib库用于数据分析中的图形绘制. ... matplotlib 绘图基础 ...

  5. python定义一个空数组_python – 在numpy数组中设置空值

    如何基于条件使numpy数组中的某些值为空? 我不明白为什么我最终得到0而不是null或空值不满足条件- b是一个用0和1值填充的numpy数组,c是另一个完全填充的numpy数组.所有阵列都是71x ...

  6. python numpy数据类型_Python之numpy数组学习(一)

    原标题:Python之numpy数组学习(一) 我回来了. 前言 前面已经安装并学习了Python中的科学计算库,今天主要学习下numpy数组. Numpy数组对象 Numpy中的多维数组称为ndar ...

  7. Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组、split函数垂直拆分二维numpy数组

    Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组.split函数垂直拆分二维numpy数组 目录

  8. Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组、split函数水平(按列)拆分二维numpy数组

    Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组.split函数水平(按列)拆分二维numpy数组 目 ...

  9. python取出字典的某个键_python 取出字典的键或者值/如何删除一个字典的键值对/如何遍历字典...

    先定义一个字典并直接进行初始化赋值 my_dict = dict(name="lowman", age=45, money=998, hourse=None) 1.取出该字典所有的 ...

最新文章

  1. C++ char 与uchar区别
  2. 深度学习:语义分割网络
  3. 【独家】百度移动云高级美女产品经理:O2O日趋火爆,下个估值过亿的上门美业将花落谁家?...
  4. Keil的可重定位段
  5. Android几秒后自动关闭dialog
  6. Producing function in SQL.
  7. 多地GitHub账号使用受限;Python之父考虑重构解释器;62岁程序员埋逻辑炸弹 | 开发者周刊...
  8. Puppet常用资源使用详解
  9. 吾不是爱管闲事,实在是忍无可忍
  10. 三分钟了解云存储网关 使用场景
  11. PyCharm学习笔记04:PyCharm 键盘映射和快捷键 - Keymap Shortcuts
  12. EtherCAT中AX58100烧写xml文件的说明(2)-TwinCAT软件安装
  13. nssl 1438.战略威慑
  14. 电子病历模板编辑器_这几个邮件模板网站,帮助提升工作效率
  15. linux挂死oops定位问题
  16. python浏览器怎么设置_如何用python控制浏览器
  17. UVa 10115 - Automatic Editing
  18. 实时数仓到底是什么呢?与传统数仓有什么区别?
  19. linux经验总结(持续更新)
  20. 张小龙在2017微信公开课PRO版讲了什么(附演讲实录和2016微信数据报告)

热门文章

  1. f4menu2----Total Commander 增强型F4插件
  2. 关于视频录制动态贴纸的问题
  3. java实现手写签名_手写签字,保存笔迹到图片
  4. Win10-更改c盘下的用户文件夹名[转]
  5. php ini_get,ini_get - [ php中文手册 ] - 在线原生手册 - php中文网
  6. 根据excel列动态创建mysql表_根据数据库字段动态生成excel模版下载,上传模版获取数据存入数据库(poi 反射)...
  7. 质数与合数系列——素数判断
  8. 【Excel 教程系列第 6 篇】制作斜线表头
  9. datadog ebpf模块 offset-guess.o 问题排查解决
  10. Fuchsia源码分析--系统调用流程