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()没有此类约束
随机推荐
- MXNet学习-第一个例子:训练MNIST数据集
一个门外汉写的MXNET跑MNIST的例子,三层全连接层最后验证率是97%左右,毕竟是第一个例子,主要就是用来理解MXNet怎么使用. #导入需要的模块 import numpy as np #num ...
- Solution -「Ynoi 2018」「洛谷 P4117」五彩斑斓的世界
\(\mathcal{Description}\) Link. 给定序列 \(\{a_n\}\),处理 \(m\) 次操作: 给定 \(l,r,x\),把 \([l,r]\) 内所有 \(&g ...
- Solution -「USACO 2020.12 P」Spaceship
\(\mathcal{Description}\) Link. Bessie 在一张含 \(n\) 个结点的有向图上遍历,站在某个结点上时,她必须按下自己手中 \(m\) 个按钮中处于激活状态 ...
- gdb调试小技巧
1.进入gdb,需要源码,然后gdb+可执行文件,如果要看代码一起的就gdb+可执行文件+tui 2.设置参数 set args +参数 3.设置断点,可以b +行数或者b+函数名字 4.r就是一直跑 ...
- k8s核心资源:精简版yaml示例
yaml语法及格式校验 详见:https://www.cnblogs.com/uncleyong/p/15437385.html 创建资源的三种方式 参考:https://www.cnblogs.co ...
- react 也就这么回事 04 —— 元素渲染
为了便于后续理解,我们再来回顾和总结前面几个章节的内容 1 元素及其创建 元素是构成 React 应用的最小砖块. 元素描述了你在屏幕上想看到的内容. const element = <h1&g ...
- 渗透利器burp suite新版本v2020.9.1及v2020.8汉化版下载
Burp suite是一款抓包渗透必备软件.burp Suite是响当当的web应用程序渗透测试集成平台.从应用程序攻击表面的最初映射和分析,到寻找和利用安全漏洞等过程,所有工具为支持整体测试程序而无 ...
- Clickhouse 分布式表&本地表 &ClickHouse实现时序数据管理和挖掘
一.CK 分布式表和本地表 (1)CK是一个纯列式存储的数据库,一个列就是硬盘上的一个或多个文件(多个分区有多个文件),关于列式存储这里就不展开了,总之列存对于分析来讲好处更大,因为每个列单独存储,所 ...
- .NET 5+ 中已过时的功能
从 .NET 5 开始,一些新标记为已过时的 API 使用 ObsoleteAttribute 上的两个新属性. ObsoleteAttribute.DiagnosticId 属性指示编译器使用自定义 ...
- Java中读写锁的介绍
读写锁的简单介绍 所谓的读写锁,就是将一个锁拆分为读锁和写锁两个锁,然后你加锁的时候,可以加读锁,也可以加写锁. ReentrantLock lock=new ReentrantLock(); loc ...