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类定义的讲解
Nov 01 Python
python通过pil将图片转换成黑白效果的方法
Mar 16 Python
Python制作数据导入导出工具
Jul 31 Python
python 中if else 语句的作用及示例代码
Mar 05 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
200行python代码实现2048游戏
Jul 17 Python
Python pandas.DataFrame 找出有空值的行
Sep 09 Python
Python CSV文件模块的使用案例分析
Dec 21 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
python实现企业微信定时发送文本消息的示例代码
Nov 24 Python
python Timer 类使用介绍
Dec 28 Python
Python re.sub 反向引用的实现
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
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
JS 实现图片直接下载示例代码
2013/07/22 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
jQuery事件绑定和委托实例
2014/11/25 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
10款最好的Web开发的 Python 框架
2015/03/18 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
2021/01/27 Python
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
连锁酒店店长职责范本
2014/02/13 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
医学专业自荐信
2014/06/14 职场文书
生活部的活动方案
2014/08/19 职场文书
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS