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处理python编码问题
Mar 13 Python
python多线程扫描端口示例
Jan 16 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
Python机器学习库scikit-learn安装与基本使用教程
Jun 25 Python
python协程之动态添加任务的方法
Feb 19 Python
Python集中化管理平台Ansible介绍与YAML简介
Jun 12 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
Jan 21 Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 Python
Python API len函数操作过程解析
Mar 05 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
python pymysql库的常用操作
Oct 16 Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 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利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
浅析jQuery对select操作小结(遍历option,操作option)
2013/07/04 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
Python字符串详细介绍
2015/05/09 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
python多线程之事件Event的使用详解
2018/04/27 Python
python tornado微信开发入门代码
2018/08/24 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
基于python实现操作redis及消息队列
2020/08/27 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
Under Armour美国官网:美国知名高端功能性运动品牌
2016/09/05 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
商场总经理岗位职责
2014/02/03 职场文书
初级党校心得体会
2014/09/11 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python