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中的exec、eval使用实例
Sep 23 Python
python基础知识小结之集合
Nov 25 Python
举例讲解Python中的迭代器、生成器与列表解析用法
Mar 20 Python
python妙用之编码的转换详解
Apr 21 Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 Python
python3使用scrapy生成csv文件代码示例
Dec 28 Python
完美解决在oj中Python的循环输入问题
Jun 25 Python
python 动态生成变量名以及动态获取变量的变量名方法
Jan 20 Python
在pytorch中查看可训练参数的例子
Aug 18 Python
numpy矩阵数值太多不能全部显示的解决
May 14 Python
详解Python Celery和RabbitMQ实战教程
Jan 20 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 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数组中删除元素的实现代码
2012/06/22 PHP
php获取$_POST同名参数数组的实现介绍
2013/06/30 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
Symfony2针对输入时间进行查询的方法分析
2017/06/28 PHP
Ajax+PHP实现的删除数据功能示例
2019/02/12 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
2017/03/21 Javascript
微信小程序 开发之全局配置
2017/05/05 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
haskell实现多线程服务器实例代码
2013/11/26 Python
在Windows8上的搭建Python和Django环境
2014/07/03 Python
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
python爬取天气数据的实例详解
2020/11/20 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
会计实习生工作总结的自我评价
2013/10/07 职场文书
自我介绍演讲稿
2014/01/15 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
小马王观后感
2015/06/11 职场文书
MySQL去除重叠时间求时间差和的实现
2021/08/23 MySQL
PyTorch中permute的使用方法
2022/04/26 Python