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使用urllib2提交http post请求的方法
May 26 Python
Python开发的HTTP库requests详解
Aug 29 Python
pip matplotlib报错equired packages can not be built解决
Jan 06 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
一百行python代码将图片转成字符画
Feb 19 Python
python框架flask表单实现详解
Nov 04 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
tornado+celery的简单使用详解
Dec 21 Python
python中return的返回和执行实例
Dec 24 Python
django rest framework 自定义返回方式
Jul 12 Python
Pytorch使用shuffle打乱数据的操作
May 20 Python
解决Python中的modf()函数取小数部分不准确问题
May 28 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返回json数据函数实例
2014/10/09 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
javascript深入理解js闭包
2010/07/03 Javascript
js 弹出菜单/窗口效果
2011/10/30 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
jquery选择器简述
2015/08/31 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
微信小程序实现联动选择器
2019/02/15 Javascript
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
wxPython之解决闪烁的问题
2018/01/15 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
python实现控制台输出彩色字体
2020/04/05 Python
ASP.NET Core中的配置详解
2021/02/05 Python
HTML中使用SVG与SVG预定义形状元素介绍
2013/06/28 HTML / CSS
详解移动端Html5页面中1px边框的几种解决方法
2018/07/24 HTML / CSS
高级运动鞋:GREATS
2019/07/19 全球购物
新学期开学寄语
2014/01/18 职场文书
学生拾金不昧表扬信
2014/01/21 职场文书
2015年幼儿园毕业感言
2014/02/12 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
关于读书的活动方案
2014/08/14 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
2014年超市工作总结
2014/11/19 职场文书
受资助学生感谢信
2015/01/21 职场文书
小学入学感言
2015/08/01 职场文书
浅谈Python数学建模之整数规划
2021/06/23 Python
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技