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


Posted in Python onJune 08, 2020

我有一个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数组是图像像素数据。

Python替换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之list和str比较
Sep 20 Python
Python中使用asyncio 封装文件读写
Sep 11 Python
python实现Adapter模式实例代码
Feb 09 Python
pandas的object对象转时间对象的方法
Apr 11 Python
Python基于递归实现电话号码映射功能示例
Apr 13 Python
python实现扫描日志关键字的示例
Apr 28 Python
解决python os.mkdir创建目录失败的问题
Oct 16 Python
简单了解Python生成器是什么
Jul 02 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
python绘制动态曲线教程
Feb 24 Python
想学画画?python满足你!
Dec 24 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 Python
python如何编写win程序
Jun 08 #Python
如何写python的配置文件
Jun 07 #Python
python dict乱码如何解决
Jun 07 #Python
python中adb有什么功能
Jun 07 #Python
python如何保存文本文件
Jun 07 #Python
Python如何用wx模块创建文本编辑器
Jun 07 #Python
python如何查看网页代码
Jun 07 #Python
You might like
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
php的curl封装类用法实例
2014/11/07 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
创建公共调用 jQuery Ajax 带返回值
2012/08/01 Javascript
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
2015/09/06 Javascript
jQuery中通过ajax调用webservice传递数组参数的问题实例详解
2016/05/20 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
梳理一下vue中的生命周期
2020/12/30 Vue.js
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
从零学python系列之从文件读取和保存数据
2014/05/23 Python
Python中的生成器和yield详细介绍
2015/01/09 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
python实现广度优先搜索过程解析
2019/10/19 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
python 提高开发效率的5个小技巧
2020/10/19 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
大学校园活动策划书
2014/02/04 职场文书
给老师的一封建议书
2014/03/13 职场文书
五一劳动节活动记录
2014/03/23 职场文书
航海技术专业毕业生求职信
2014/04/06 职场文书
计划生育标语
2014/06/23 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
HTML静态页面获取url参数和UserAgent的实现
2022/08/05 HTML / CSS