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提示[Errno 32]Broken pipe导致线程crash错误解决方法
Nov 19 Python
在Python中使用Neo4j数据库的教程
Apr 16 Python
解决python3在anaconda下安装caffe失败的问题
Jun 15 Python
pandas 两列时间相减换算为秒的方法
Apr 20 Python
详解flask表单提交的两种方式
Jul 21 Python
python中class的定义及使用教程
Sep 18 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
Jan 03 Python
TensorFlow2.0:张量的合并与分割实例
Jan 19 Python
Java多线程实现四种方式原理详解
Jun 02 Python
python如何设置静态变量
Sep 07 Python
pycharm中leetcode插件使用图文详解
Dec 07 Python
python实现经纬度采样的示例代码
Dec 10 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 MemCached 高级缓存应用代码
2010/08/05 PHP
php中使用DOM类读取XML文件的实现代码
2011/12/14 PHP
php foreach循环中使用引用的问题
2013/11/06 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
总结的一些PHP开发中的tips(必看篇)
2017/03/24 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
js parseInt(&quot;08&quot;)未指定进位制问题
2010/06/19 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
JavaScript中的异常捕捉介绍
2014/12/31 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
浅谈js函数三种定义方式 &amp; 四种调用方式 &amp; 调用顺序
2017/02/19 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
浅谈vant组件Picker 选择器选单选问题
2020/11/04 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python sys.path详细介绍
2013/10/17 Python
Python爬取读者并制作成PDF
2015/03/10 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
扩大国家免疫规划实施方案
2014/03/21 职场文书
小学毕业寄语大全
2014/04/03 职场文书
小学生新年寄语
2014/04/03 职场文书
勾股定理课后反思
2014/04/26 职场文书
美术专业自荐信
2014/07/07 职场文书
工厂标语大全
2014/10/06 职场文书
关于职业道德的心得体会
2016/01/18 职场文书