简介
Numpy是最流行的数学计算Python库。它提供了大量的数学工具,包括但不限于多维数组和矩阵、数学函数、数字生成器,以及更多。
NumPy的基本工具之一是ndarray - 一个N维的数组。今天,我们将创建 阵列,使用NumPy.arange() 函数在某些范围内生成。
参数和返回
numpy.arange([start, ]stop, [step, ]dtype=None)
返回一个给定区间内的均匀间隔的数值,其中。
- start是一个数字(整数或实数),是数组的起始点。它是可选的。
- stop是一个数字(整数或实数),是数组的结束点,不包括在其中。
- step是一个数字,用于设置数组中连续数值之间的间隔。它是可选的,默认为1。
- dtype是数组元素的输出类型。默认情况下是无。
该方法返回一个ndarray 的均匀间隔的值。如果数组返回浮点元素,那么数组的长度将是ceil((stop - start)/step) 。
*np.range()*的例子
导入NumPy
为了开始使用NumPy,我们需要导入它,因为它是一个外部库。
import NumPy as np
如果没有安装,你可以通过pip 轻松地安装它。
$ pip install numpy
所有参数np.range()
让我们看看arange() ,该函数的所有参数是如何工作的。例如,假设我们想要一个序列从0开始,在10处停止,步长为3,同时产生整数。
在Python环境下,或者说REPL,让我们在一个范围内生成一个序列。
>>> result_array = np.arange(start=0, stop=10, step=2, dtype=int)
array 是一个包含生成元素的ndarray 。
>>> result_array
array([0, 2, 4, 6, 8])
值得注意的是,stop 元素没有包括在内,而start 元素包括在内,因此我们有一个0 ,但没有一个10 ,尽管序列中的下一个元素应该是一个10 。
注意:像往常一样,你可以提供位置参数,而不用命名它们或命名参数。
array = np.arange(start=0, stop=10, step=2, dtype=int)
# These two statements are the same
array = np.arange(0, 10, 2, int)
为了简洁起见,经常使用后者,而且这些参数的位置必须遵循start,stop,step 和dtype 的顺序。
np.arrange()带停止
如果只提供一个参数,它将被视为stop 。它将输出所有的数字,直到但不包括stop ,默认的步骤是1 ,start ,0 。
>>> result_array = np.arange(5)
>>> result_array
array([0, 1, 2, 3, 4])
np.range()带有start和stop
有两个参数,它们默认为start 和stop ,默认的step 为1 - 所以你可以很容易地创建一个特定的范围,而不用考虑步长的问题。
>>> result_array = np.arange(5, 10)
>>> result_array
array([5, 6, 7, 8, 9])
像以前的例子一样,你也可以在这里使用浮点数而不是整数。例如,我们可以从5.5开始。
>>> result_array = np.arange(5.5, 11.75)
得到的数组将是。
>>> result_array
array([ 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5])
np.range(),带有start、stop和step
默认的dtype 是None ,在这种情况下,ints被使用,所以有一个基于整数的范围很容易用start,stop 和step 来创建。例如,让我们生成一个6 (包括)和22 (不包括)之间所有偶数的序列。
>>> result_array = np.arange(6, 22, 2)
其结果将是6到22之间的所有偶数,但不包括22。
>>> result_array
array([ 6, 8, 10, 12, 14, 16, 18, 20])
*np.range()*用于反转区间
我们也可以在np.arange() 函数中传入负数参数来得到一个反转的数字数组。
start 将是我们要开始计数的较大的数字,stop 将是较小的数字,而步骤将是一个负数。
result_array = np.arange(start=30,stop=14, step=-3)
结果将是一个负数步长为3的降序数组。
>>> result_array
array([30, 27, 24, 21, 18, 15])
用*np.range()*创建空的NDArrays
我们也可以创建一个空的range,如下所示。
>>> result_array = np.arange(0)
其结果将是一个空数组。
>>> result_array
array([], dtype=int32)
发生这种情况是因为0 是我们设置的stop ,而起始值默认也是0 。所以,计数在开始之前就停止了。
另一种情况是,当起始值高于停止值,而步长为正时,结果将是一个空数组。比如说。
>>> result_array = np.arange(start=30, stop=10, step=1)
结果也将是一个空数组。
>>> result_array
array([], dtype=int32)
这种情况也可以反过来发生。我们可以从一个小的数字开始,在一个较大的数字上停止,并且step 为一个负数。输出也将是一个空数组。
>>> result_array = np.arange(start=10, stop=30, step=-1)
这也会导致一个空的ndarray 。
>>> result_array
array([], dtype=int32)
np.range()的支持数据类型
dtype参数,默认为int,可以是任何有效的NumPy数据类型。
**注意:**但这不能与标准的Python数据类型相混淆。
你可以对一些更常见的数据类型使用速记版本,或者使用全称,前缀为np. 。
np.arange(..., dtype=int)
np.arange(..., dtype=np.int32)
np.arange(..., dtype=np.int64)
对于其他一些数据类型,例如np.csignle ,你可以在类型前加上np. 。
>>> result_array = np.arange(start=10, stop=30, step=1, dtype=np.csingle)
>>> result_array
array([10.+0.j, 11.+0.j, 12.+0.j, 13.+0.j, 14.+0.j, 15.+0.j, 16.+0.j,
17.+0.j, 18.+0.j, 19.+0.j, 20.+0.j, 21.+0.j, 22.+0.j, 23.+0.j,
24.+0.j, 25.+0.j, 26.+0.j, 27.+0.j, 28.+0.j, 29.+0.j],
dtype=complex64)
一个常见的简短的数据类型是float 。
>>> result_array = np.arange(start=10, stop=30, step=1, dtype=float)
>>> result_array
array([10., 11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 21., 22.,
23., 24., 25., 26., 27., 28., 29.])
关于所有支持的NumPy数据类型的列表,请看官方文档。
np.range()vsnp.linspace()
np.linspace() 在返回均匀间隔的数组方面与 相似。然而,有几个不同之处。np.arange()
使用np.linspace() ,你指定某个范围内的样本数,而不是指定步长。此外,你可以在返回的数组中包括端点。另一个区别是,np.linspace() 可以生成多个数组,而不是只返回一个数组。
这是一个简单的例子,np.linspace() ,包括端点和5个样本。
>>> result_array = np.linspace(0, 20, num=5, endpoint=True)
>>> result_array
array([ 0., 5., 10., 15., 20.])
这里,样本数和步长都是5 ,但这是巧合。
>>> result_array = np.linspace(0, 20, num=2, endpoint=True)
>>> result_array
array([ 0., 20.])
在这里,我们在0和20之间做了两个点,所以它们自然相隔20步。你也可以把endpoint 到False 和 np.linspace()will behave more likenp.range()`,因为它不包括最后的元素。
>>> result_array = np.linspace(0, 20, num=5, endpoint=False)
>>> result_array
array([ 0., 4., 8., 12., 16.])
np.range()与内置range()对比
Python 的内置range() 函数和np.arange() 有很多相似之处,但也有细微的差别。在下面的章节中,我们将强调它们之间的一些相同点和不同点。
参数和返回
主要的相似之处是它们都有一个start ,stop ,和step 。此外,它们都是start ,并且stop ,默认的step ,1 。
然而。
- np.range()
- 可以处理多种数据类型,包括浮点数和复数
- 返回一个
ndarray - 数组在内存中被完全创建
- 范围()
- 只能处理整数
- 返回一个
range对象 - 根据需要生成数字
效率和速度
np.arange() 和内置的range() 函数在速度和效率上有一些区别。范围函数是按需生成数字,而不是在内存中预先创建它们。
如果你知道你会在这个范围内的某个地方出现问题,这有助于加快程序的进行。比如说。
for i in range(100000000):
if i == some_number:
break
这将消耗较少的内存,因为不是所有的数字都提前创建。这也使得ndarrays ,最初构建的速度较慢。
然而,如果你仍然需要内存中的整个数字范围,那么当整个数字范围出现时,np.arange() ,在它们被构建后,明显比range() 快。
例如,如果我们只是对它们进行迭代,由于前期成本较高,创建数组的时间使得np.arange() 的性能较慢。
$ python -m timeit "for i in range(100000): pass"
200 loops, best of 5: 1.13 msec per loop
$ python -m timeit "import numpy as np" "for i in np.arange(100000): pass"
100 loops, best of 5: 3.83 msec per loop
结论
本指南旨在帮助你了解np.arange() 函数的工作原理以及如何生成数字序列。
下面是对我们刚才所讲内容的一个简单回顾。
np.arange()有4个参数。- start是一个数字(整数或实数),是数组的起始点。它是可选的。
- stop是一个数字(整数或实数),是数组的结束点,不包括在其中。
- step是一个数字,用于设置数组中连续数值之间的间隔。它是可选的,默认为1。
- dtype是数组元素的输出类型。默认情况下是
None。
- 你可以在range中使用多种dtype,包括ints, floats, 和复数。
- 你可以通过将较大的数字作为开始,较小的数字作为停止,并将步长作为一个负数来生成反向范围。
np.linspace()在生成数字范围方面与 相似,但不同的是包括包括端点的能力,以及生成一个np.arange()样本数而不是步长,后者是根据样本数计算的。np.arange()当你需要创建整个数组的时候,summary比range更有效。然而,如果你知道在循环时你会在某个地方中断,那么range就更好。