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 fabric实现远程部署
Jan 05 Python
Python实现感知机(PLA)算法
Dec 20 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
Feb 02 Python
django 微信网页授权认证api的步骤详解
Jul 30 Python
Python 利用高德地图api实现经纬度与地址的批量转换
Aug 14 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
Apr 08 Python
基于Python+QT的gui程序开发实现
Jul 03 Python
python利用线程实现多任务
Sep 18 Python
python 用struct模块解决黏包问题
Nov 07 Python
Python接口自动化测试框架运行原理及流程
Nov 30 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中截取字符串支持utf-8
2007/01/18 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
js 阻止子元素响应父元素的onmouseout事件具体实现
2013/12/23 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
2016/06/14 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
vue实现移动端悬浮窗效果
2018/12/01 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
js实现省级联动(数据结构优化)
2020/07/17 Javascript
详解Vue的组件中data选项为什么必须是函数
2020/08/17 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
Python用GET方法上传文件
2015/03/10 Python
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
python针对excel的操作技巧
2018/03/13 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
Python页面加载的等待方式总结
2021/02/28 Python
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
什么是数组名
2012/05/10 面试题
拖鞋店创业计划书
2014/01/15 职场文书
四群教育工作实施方案
2014/03/26 职场文书
给公司的建议书范文
2014/05/13 职场文书
分析并发编程之LongAdder原理
2021/06/29 Java/Android