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小技巧分享
Nov 22 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
python+pyqt实现右下角弹出框
Oct 26 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 Python
Python爬取破解无线网络wifi密码过程解析
Sep 17 Python
python通过链接抓取网站详解
Nov 20 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
Python实现CAN报文转换工具教程
May 05 Python
PyTorch实现重写/改写Dataset并载入Dataloader
Jul 14 Python
python接口测试返回数据为字典取值方式
Feb 12 Python
Python+Matplotlib+LaTeX玩转数学公式
Feb 24 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伪静态写法附代码
2008/06/20 PHP
php使用websocket示例详解
2014/03/12 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
JS获取父节点方法
2009/08/20 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
nodejs批量修改文件编码格式
2015/01/22 NodeJs
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
2016/05/31 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
Electron-vue开发的客户端支付收款工具的实现
2019/05/24 Javascript
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
python中子类调用父类函数的方法示例
2017/08/18 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
python如何使用腾讯云发送短信
2020/09/17 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
庆祝教师节活动方案
2014/01/31 职场文书
老师的检讨书
2014/02/23 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript
Spring Boot 实现 WebSocket
2022/04/30 Java/Android