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服务器与android客户端socket通信实例
Nov 12 Python
python执行子进程实现进程间通信的方法
Jun 02 Python
Python的math模块中的常用数学函数整理
Feb 04 Python
利用python批量检查网站的可用性
Sep 09 Python
Python中矩阵创建和矩阵运算方法
Aug 04 Python
python 多线程重启方法
Feb 18 Python
Tensorflow累加的实现案例
Feb 05 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
Python数据可视化图实现过程详解
Jun 12 Python
Python如何读取、写入JSON数据
Jul 28 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
Dec 08 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
我的论坛源代码(六)
2006/10/09 PHP
使用PHP遍历文件目录与清除目录中文件的实现详解
2013/06/24 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
PHP实现简易计算器功能
2020/08/28 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
深入理解JS DOM事件机制
2016/08/06 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
react-router实现跳转传值的方法示例
2017/05/27 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
Python中pygame安装方法图文详解
2015/11/11 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
Python目录和文件处理总结详解
2019/09/02 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
使用C#编写创建一个线程的代码
2013/01/22 面试题
初中生个人学习的自我评价
2013/12/04 职场文书
优秀老师事迹材料
2014/02/05 职场文书
文明风采获奖感言
2014/02/18 职场文书
某集团股份有限公司委托书样本
2014/09/24 职场文书
语文复习计划
2015/01/19 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
幸福终点站观后感
2015/06/04 职场文书
毕业典礼主持词
2015/06/29 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android