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 相关文章推荐
以windows service方式运行Python程序的方法
Jun 03 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
对python中raw_input()和input()的用法详解
Apr 22 Python
python将秒数转化为时间格式的实例
Sep 16 Python
python生成器与迭代器详解
Jan 01 Python
正确理解Python中if __name__ == '__main__'
Jan 24 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
Python OS模块实例详解
Apr 15 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 Python
python字符串,元组,列表,字典互转代码实例详解
Feb 14 Python
python要安装在哪个盘
Jun 15 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
PHP4实际应用经验篇(3)
2006/10/09 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
jQuery常用且重要方法汇总
2015/07/13 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
JavaScript驾驭网页-CSS与DOM
2016/03/24 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
npm国内镜像 安装失败的几种解决方案
2017/06/04 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
Typescript的三种运行方式(小结)
2019/09/18 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
Scrapy的简单使用教程
2017/10/24 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
python实现淘宝购物系统
2019/10/25 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
sort命令的作用和用法
2012/11/04 面试题
运动会开幕式主持词
2014/03/28 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
学校捐款活动总结
2015/05/09 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python