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读大数据txt
Mar 28 Python
Python使用Matplotlib实现雨点图动画效果的方法
Dec 23 Python
python使用selenium实现批量文件下载
Mar 11 Python
Python实现带下标索引的遍历操作示例
May 30 Python
Python中生成一个指定长度的随机字符串实现示例
Nov 06 Python
python 微信好友特征数据分析及可视化
Jan 07 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 Python
python 中的命名空间,你真的了解吗?
Aug 19 Python
Pytest单元测试框架如何实现参数化
Sep 05 Python
PyQt5结合QtDesigner实现文本框读写操作
Jun 11 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 Python
Python软件包安装的三种常见方法
Jul 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二分查找二种实现示例
2014/03/12 PHP
twig里使用js变量的方法
2016/02/05 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
Javascript注入技巧
2007/06/22 Javascript
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
js实现圆盘记速表
2015/08/03 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
HTML的select控件美化
2017/03/27 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
python数据结构之列表和元组的详解
2017/09/23 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
Python 动态导入对象,importlib.import_module()的使用方法
2019/08/28 Python
django admin 添加自定义链接方式
2020/03/11 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
建筑公司文秘岗位职责
2013/11/29 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
委托书范本格式
2019/04/18 职场文书
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP