Python:range、np.arange和np.linspace
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个参数,则我们会将在[start
, stop
)区间以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.arange
是NumPy
包的一个函数,它的功能与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文档风格写法)
其中start
、step
、step
的使用与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
时,start
和stop
表示序列的开始和初始值(闭区间[start, stop]
),num
为区间[start, stop]
按照均匀(evenly)划分采样的样本数(包括边界start
和stop
在内)。不过需要注意的是,endpoint
为True
时stop
才能做为最后一个样本,为False
时区间内便不包括stop
,此时会在区间[start,end]
内按照总个数为num + 1
个样本采样并去掉尾部样本(即stop
点)组成。retstep
位置为True
则会返回(samples, step)
元组,其中samples
为生成的样本,step
为样本之间的间隔步长。
numpy.linspace
的常见使用样例如下:
print(np.linspace(2.0, 3.0, num=5))
# array([2. , 2.25, 2.5 , 2.75, 3. ])
如果设置endpoint
为True
,则按照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)
下面我们用图形形象化地描述endpoint
取True
和取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()
图像显示如下:
可以看出橘色的点为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个点。
参考
- [1] https://docs.python.org/3/library/stdtypes.html?highlight=range#range
- [2] https://stackoverflow.com/questions/43999181/range-non-default-parameter-follows-default-one
- [3] https://numpy.org/doc/stable/reference/generated/numpy.arange.html?highlight=arange#numpy.arange
- [4] https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy.linspace
Python:range、np.arange和np.linspace的更多相关文章
- python 中range numpy.arange 和 numpy.linspace 的区别
1.返回值不同 range返回一个range对象,numpy.arange和numpy.linspace返回一个数组. 2.np.arange的步长可以为小数,但range的步长只能是整数. 与Pyt ...
- python range和arange
range:自带函数,返回一个序列 range(起始点,终止点(不包含),步长(整数)) 起始点和步长都可以省略,起始点默认为0,步长默认为1 range(1,11,2) [1,3,5,7,9] ...
- Python中range, np.arange, np.linspace的区别
目录 range np.arange np.linspace range 特点 range()是python内置函数,指定开始值,终值和步长生成等差数列的一维数组 不包含终值 步长只能是整数,生成整数 ...
- numpy 辨异(四)—— np.repeat 与 np.tile
>> import numpy as np >> help(np.repeat) >> help(np.tile) 二者执行的是均是复制操作: np.repeat: ...
- 区分range() , np.arange() , np.linspace()
content: range() np.arange() np.linspace() 一.range(start, stop, step) 1.range() 为 python 自带函数 2.生成一个 ...
- python基础 range()与np.arange()
range()返回的是range object,而np.nrange()返回的是numpy.ndarray() range尽可用于迭代,而np.nrange作用远不止于此,它是一个序列,可被当做向量使 ...
- range() 与 np.arange()
转自:http://blog.csdn.net/lanchunhui/article/details/49493633 range()返回的是range object,而np.nrange()返回的是 ...
- 【转】np.linspace()、np.logspace()、np.arange()
转自:https://blog.csdn.net/ui_shero/article/details/78881067 1.np.linspace() 生成(start,stop)区间指定元素个数num ...
- range() 和 np.arange()区别
range() 和 np.arange()区别 range(start,stop,step) 三个参数都必须是整数 np.arange()没有此类约束
随机推荐
- Solution -「多校联训」古老的序列问题
\(\mathcal{Description}\) Link. 给定序列 \(\{a_n\}\),和 \(q\) 次形如 \([L,R]\) 的询问,每次回答 \[\sum_{[l,r]\su ...
- NTFS ADS(备用数据流)
NTFS Alternate Data Stream(ADS) 1993年微软推出了基于流行的NT平台的Windows NT操作系统.之后,NTFS作为WIndows开发基于NT的操作系统时的首选 ...
- pytest(12)-Allure常用特性allure.attach、allure.step、fixture、environment、categories
上一篇文章pytest Allure生成测试报告我们学习了Allure中的一些特性,接下来继续学习其他常用的特性. allure.attach allure.attach用于在测试报告中添加附件,补充 ...
- 北大博士生提出CAE,下游任务泛化能力优于何恺明MAE
大家好,我是对白. 何恺明时隔两年发一作论文,提出了一种视觉自监督学习新范式-- 用掩蔽自编码器MAE,为视觉大模型开路. 这一次,北大博士生提出一个新方法CAE,在其下游任务中展现的泛化能力超过了M ...
- kaptcha验证码参数设置
Constant 描述 默认值 kaptcha.border 图片边框,合法值:yes , no yes kaptcha.border.color 边框颜色,合法值: r,g,b (and optio ...
- [LeetCode]1389. 按既定顺序创建目标数组
给你两个整数数组 nums 和 index.你需要按照以下规则创建目标数组: 目标数组 target 最初为空. 按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组 ...
- 【Windows 访问控制】八、安全主体和安全对象
安全主体(security principal)? 安全主体是任何可通过操作系统进行身份验证的实体,例如用户帐户.计算机帐户.在用户或计算机帐户的安全上下文中运行的线程或进程,或者这些帐户的安全组. ...
- [系统安全] 十六.PE文件逆向基础知识(PE解析、PE编辑工具和PE修改)
[系统安全] 十六.PE文件逆向基础知识(PE解析.PE编辑工具和PE修改) 文章来源:https://masterxsec.github.io/2017/05/02/PE%E6%96%87%E4%B ...
- /etc/fstab文件的详解
转至:https://blog.csdn.net/youmatterhsp/article/details/83933158 一./etc/fstab文件的作用 磁盘被手动挂载之后都必须把挂载信息写入 ...
- tput用法详解-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月28日 tput 命令将通过 terminfo 数据库对终端会话进行初始化和操作. 主要功能为:移动更改光标.更改文本属性颜色.清除屏幕特定区域. ...