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脚本文件打包成可执行文件的方法
Jun 02 Python
Python编码爬坑指南(必看)
Jun 10 Python
Python利用matplotlib生成图片背景及图例透明的效果
Apr 27 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
修改python plot折线图的坐标轴刻度方法
Dec 13 Python
对python模块中多个类的用法详解
Jan 10 Python
Python匿名函数及应用示例
Apr 09 Python
微信公众号token验证失败解决方案
Jul 22 Python
django框架模型层功能、组成与用法分析
Jul 30 Python
python实现人脸签到系统
Apr 13 Python
Python如何合并多个字典或映射
Jul 24 Python
Python基于staticmethod装饰器标示静态方法
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 的 __FILE__ 常量
2007/01/15 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
eAccelerator的安装与使用详解
2013/06/13 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
不用ajax实现点击文字即可编辑的方法
2007/12/16 Javascript
什么是JavaScript
2009/08/13 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
python在windows下实现备份程序实例
2014/07/04 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
django输出html内容的实例
2018/05/27 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
python随机生成库faker库api实例详解
2019/11/28 Python
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
保安员岗位职责
2013/11/17 职场文书
护理学应聘自荐书范文
2014/02/05 职场文书
迎七一演讲稿
2014/09/12 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
MySQL基础(一)
2021/04/05 MySQL
在 Python 中利用 Pool 进行多线程
2022/04/24 Python