Python中 range | np.arange | np.linspace三者的区别

Python是不允许定义两个类初始化函数的,其实其CPython实现更像是传入不定长参数*args,然后根据len(args)来进行不同的拆分,但我们这里遵循Python文档风格写法

Posted in Python onMarch 22, 2022

1. range

range是python内置的一个,该类型表示一个不可改变(immutable)的数字序列,常常用于在for循环中迭代一组特殊的数,它的原型可以近似表示如下:

class range(stop)
class range(start, stop, step=1)

(注意,Python是不允许定义两个类初始化函数的,其实其CPython实现更像是传入不定长参数*args,然后根据len(args)来进行不同的拆分,但我们这里遵循Python文档风格写法)

如果只传入stop参数,那么我们就默认在[0, stop)区间以步长1进行迭代。如果传入2或3个参数,则我们会将在[startstop)区间以step步长(可选,默认为1)迭代 。注意,三个参数必须全部为整数值

它的常见使用样例如下:

print(list(range(10)))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(range(0, 30, 5)))
# [0, 5, 10, 15, 20, 25]

stop<=start时,而直接采用默认的step=1时,元素会为空:

print(list(range(0)))
# []
print(list(range(1, 0)))
# []

此时的迭代我们需要将迭代步长设置为负:

print(list(range(0, -10, -1)))
# [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

如果非法地传入非整数的参数,如:

print(list(range(10, 0.3)))

则会报以下的TypeError:

'float' object cannot be interpreted as an integer

最后提一下,我们常常会写下如下代码:

for i in range(10):
    print(i)

此时Python解释器实质上会将range对象隐式转化为迭代器,等价于如下代码:

list_iterator = iter(range(10))
try:
    while True:
        x = next(list_iterator)
        print(x)
except StopIteration:
    pass

2. numpy.arange

numpy.arangeNumPy包的一个函数,它的功能与Python内置的range类似,它的原型可以近似表示为:

numpy.arange(stop, dtype=None, like=None)
numpy.arange(start, stop, step=1, dtype=None, like=None)

(还是如前面所说,Python是不允许定义两个类初始化函数的,其实其CPython实现更像是传入不定长参数*args,然后根据len(args)来进行不同的拆分,但我们这里遵循Python文档风格写法)

其中startstepstep的使用与range类似,此处不再赘述,唯一的区别就是这3个参数都可以是小数。dtype为返回array的类型,如果没有给定则会从输入输入参数中推断。like为一个array-like的类型,它允许创建非NumPy arrays的arrays类型。

总结一下,该类与Python内置的range区别有两点:一是支持小数参数,二是返回ndarray类型而非像range那样常常做为(隐式转换为)list类型使用。

以下是其常见用例:

print(np.arange(3))
# [0 1 2]
print(np.arange(3.0))
# [0. 1. 2.]
print(np.arange(3,7))
# [3 4 5 6]
print(np.arange(3,7,2))
# [3 5]
print(np.arange(0, 5, 0.5))
#[0.  0.5 1.  1.5 2.  2.5 3.  3.5 4.  4.5]

注意,在numpy.arange的使用过程中可能存在浮点稳定性的问题,从而导致下面这样的意想不到的结果:

print(np.arange(0, 5, 0.5, dtype=int))
# [0 0 0 0 0 0 0 0 0 0]
print(np.arange(-3, 3, 0.5, dtype=int))
# [-3 -2 -1  0  1  2  3  4  5  6  7  8]

这是因为在np.arange的内部实现中,实际上的step值是按照公式dtype(start+step)-dtype(start)来计算的,而非直接采用step。当进行强制类型转换(上面例子中转为int,即朝0方向取整)或start远远比step大时,会出现精度的损失。在这种情况下,建议使用下面提到的np.linspace

3. numpy.linspace

numpy.linspace也是Numpy内置的一个函数,它和numpy.arange类似,但是它不再是简单的[start, stop)左闭右开,也没有使用步长step,而是使用样本个数num。其函数原型如下:

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)

其中当endpoint采用默认的True时,startstop表示序列的开始和初始值(闭区间[start, stop]),num为区间[start, stop]按照均匀(evenly)划分采样的样本数(包括边界startstop在内)。不过需要注意的是,endpointTruestop才能做为最后一个样本,为False时区间内便不包括stop,此时会在区间[start,end]内按照总个数为num + 1个样本采样并去掉尾部样本(即stop点)组成。retstep位置为True则会返回(samples, step)元组,其中samples为生成的样本,step为样本之间的间隔步长。

注意,它的start、stop参数都可以为小数,但是当dtype设置为int时则就不能为小数

numpy.linspace的常见使用样例如下:

print(np.linspace(2.0, 3.0, num=5))
# array([2.  , 2.25, 2.5 , 2.75, 3.  ])

如果设置endpointTrue,则按照num+1个样本数量来采样,并去掉最后一个样本。

print(np.linspace(2.0, 3.0, num=5, endpoint=False))
# [2.  2.2 2.4 2.6 2.8]

如果retstep设置为True,则除了返回生成的样本,还会返回样本之间的间隔步长。

print(np.linspace(2.0, 3.0, num=5, retstep=True))
# (array([2.  ,  2.25,  2.5 ,  2.75,  3.  ]), 0.25)

下面我们用图形形象化地描述endpointTrue和取False的区别:

import matplotlib.pyplot as plt
N = 8
y = np.zeros(N)
x1 = np.linspace(0, 10, N, endpoint=True)
x2 = np.linspace(0, 10, N, endpoint=False)
plt.plot(x1, y, 'o', color='orange')
plt.plot(x2, y + 0.5, 'o', color='blue')
plt.ylim([1, -0.5])
plt.show()

图像显示如下:

Python中 range | np.arange | np.linspace三者的区别

可以看出橘色的点为np.linspace(0, 10, N, endpoint=True),按照总共8个点在[0, 10]采样,并包括stop边界10。蓝色的点为np.linspace(0, 10, N, endpoint=False),先按照总共9个点在[0, 10]采样最后再去掉最后一个点(即stop点10),最终得到间隙更密的8个点。

参考

到此这篇关于Python中range、np.arange和np.linspace的区别的文章就介绍到这了,更多相关Python range np.arange np.linspace内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python脚本实现Web漏洞扫描工具
Oct 25 Python
Python AES加密实例解析
Jan 18 Python
python读写LMDB文件的方法
Jul 02 Python
Django中的文件的上传的几种方式
Jul 23 Python
在Python中使用gRPC的方法示例
Aug 08 Python
python3安装speech语音模块的方法
Dec 24 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
Django stark组件使用及原理详解
Aug 22 Python
面向对象学习之pygame坦克大战
Sep 11 Python
python多进程并行代码实例
Sep 30 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
Jul 02 Python
python集合的新增元素方法整理
Dec 07 Python
Python中非常使用的6种基本变量的操作与技巧
python使用torch随机初始化参数
Mar 22 #Python
Django基础CBV装饰器和中间件
详解pytorch创建tensor函数
Mar 22 #Python
详解Python+OpenCV绘制灰度直方图
PYTHON使用Matplotlib去实现各种条形图的绘制
Python+OpenCV实现在图像上绘制矩形
You might like
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
一个原生的用户等级的进度条
2010/07/03 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
微信小程序左右滑动切换页面详解及实例代码
2017/02/28 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
JS实现动态添加DOM节点和事件的方法示例
2017/04/28 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
详解react-redux插件入门
2018/04/19 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
vue-cli4使用全局less文件中的变量配置操作
2020/10/21 Javascript
python 数据加密代码
2008/12/24 Python
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
Django在win10下的安装并创建工程
2017/11/20 Python
python构建深度神经网络(续)
2018/03/10 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
优秀教师先进个人事迹材料
2014/08/31 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
贫困证明怎么写
2015/06/16 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python
Java实现注册登录跳转
2022/06/16 Java/Android