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 break语句详解
Mar 11 Python
编写自定义的Django模板加载器的简单示例
Jul 21 Python
Python学习之Anaconda的使用与配置方法
Jan 04 Python
python画图系列之个性化显示x轴区段文字的实例
Dec 13 Python
Python3实现的旋转矩阵图像算法示例
Apr 03 Python
Python supervisor强大的进程管理工具的使用
Apr 24 Python
详解pytorch 0.4.0迁移指南
Jun 16 Python
python os.path.isfile()因参数问题判断错误的解决
Nov 29 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
Feb 06 Python
python3的pip路径在哪
Jun 23 Python
python实现自动清理重复文件
Aug 24 Python
详解pandas apply 并行处理的几种方法
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调用三种数据库的方法(1)
2006/10/09 PHP
PHP 可阅读随机字符串代码
2010/05/26 PHP
php根据年月获取季度的方法
2014/03/31 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
PHP类的封装与继承详解
2015/09/29 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
php字符集转换
2017/01/23 PHP
用jscript启动sqlserver
2007/06/21 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
javascript验证上传文件的类型限制必须为某些格式
2013/11/14 Javascript
探讨jQuery的ajax使用场景(c#)
2013/12/03 Javascript
js中生成map对象的方法
2014/01/09 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
2017/04/21 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
2018/11/30 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
keras多显卡训练方式
2020/06/10 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
有机童装:Toby Tiger
2018/05/23 全球购物
社会调查研究计划书
2014/05/01 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
授权委托书样本
2014/09/25 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
2021/06/26 MySQL
MySQL 原理与优化之Update 优化
2022/08/14 MySQL