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()没有此类约束
随机推荐
- K8s二进制部署单节点 etcd集群,flannel网络配置 ——锥刺股
K8s 二进制部署单节点 master --锥刺股 k8s集群搭建: etcd集群 flannel网络插件 搭建master组件 搭建node组件 1.部署etcd集群 2.Flannel 网络 ...
- Nginx中的Location和Rewrite
Nginx中的Location和Rewrite 目录 Nginx中的Location和Rewrite 一.location 1. location的分类 2. location常用的匹配规则 3. l ...
- 程序员的情人节「GitHub 热点速览 v.22.07」
又是一年情人日,刚好还是发文的今天.也没什么好送的,送点程序员的浪漫--代码和开源项目吧.记得在本周特推查收这份来自程序员的独有浪漫. 本周 GitHub 霸榜的项目基本上都是老项目,从老项目中挖点新 ...
- Spark入门案例 - 统计单词个数 / wordcount
Scala版 import org.apache.spark.{SparkConf, SparkContext} object WordCountScala { def main(args: Arra ...
- 虫师Selenium2+Python_2、测试环境搭建
windows环境配置: 步骤: 安装python 官网下载http://www.seleniumhq.org/ https://www.python.org/downloads/windows/ 3 ...
- LibOpenCM3(四) VSCode IDE 环境配置
目录 LibOpenCM3(一) Linux下命令行开发环境配置 LibOpenCM3(二) 项目模板 Makefile分析 LibOpenCM3(三) .ld文件(连接器脚本)和startup代码说 ...
- 使用传统的三层架构出现的问题.引入Spring底层实现原理来解决(工厂模式+反射+XML配置文件/注解)
以前写的代码 mapper层 public interface PersonMapper { void selectPersonList(); } public class PersonMapperI ...
- validator参数校验
目录 validator参数校验 validator参数校验 type Req struct { Sn string `json:"sn" binding:"requir ...
- 盘点Go中的开发神器
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用as ...
- [题解]UVA10269 Adventure of Super Mario
链接:http://vjudge.net/problem/viewProblem.action?id=24902 描述:由城镇.村子和双向边组成的图,从A+B走到1,要求最短路.有K次瞬移的机会,距离 ...