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字符串和字典
Jul 07 Python
Python中序列的修改、散列与切片详解
Aug 27 Python
基于MTCNN/TensorFlow实现人脸检测
May 24 Python
python list格式数据excel导出方法
Oct 31 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
Jun 17 Python
python and or用法详解
Jun 26 Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 Python
Python使用matplotlib绘制三维参数曲线操作示例
Sep 10 Python
Tensorflow实现多GPU并行方式
Feb 03 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
Python unittest单元测试openpyxl实现过程解析
May 27 Python
python中使用asyncio实现异步IO实例分析
Feb 26 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
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
dojo 之基础篇
2007/03/24 Javascript
jQuery 渐变下拉菜单
2009/12/15 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
js重写方法的简单实现
2016/07/10 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
python pickle 和 shelve模块的用法
2013/09/16 Python
Python lambda和Python def区别分析
2014/11/30 Python
python框架django基础指南
2016/09/08 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
python如何爬取个性签名
2018/06/19 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
工地门卫岗位职责
2013/12/30 职场文书
奠基仪式策划方案
2014/05/15 职场文书
企业文化口号
2014/06/12 职场文书
超市促销活动总结
2014/07/01 职场文书
名人演讲稿范文
2014/09/16 职场文书
干部考核工作总结2015
2015/07/24 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
Pygame如何使用精灵和碰撞检测
2021/11/17 Python