项目 | 描述 |
---|---|
菜鸟教程 | NumPy 教程 |
NumPy | API reference |
利用 Python 进行数据分析 | 韦斯·麦金尼 / 徐敬一 译 |
搜索引擎 | Bing |
项目 | 描述 |
---|---|
Jupyter Notebook | 6.5.2 |
Python | 3.9.13 |
NumPy(Numerical Python) 是一个开源的 Python 第三方库,几乎用于每个科学和工程领域。
NumPy 与 SciPy、Matplotlib、SciKits 等其他众多 Python 科学计算库很好的结合在一起,共同构建了一个完整的科学计算生态系统。
NumPy 支持广泛的硬件及计算平台,并且可以很好地使用分布式、 GPU 和稀疏数组库。
NumPy 可以同时针对整个数组中的每个元素进行复杂计算而不需要使用到 Python 循环。
NumPy 在内部将数据存储在连续的内存空间中(有利于提高数据的处理速度),这与 Python 中的其他序列结构的存储方式是不同的。
存储相同的数据,NumPy 使用的内存量小于 Python 中的其他序列结构。
NumPy 的多维数组对象仅支持相同数据类型的数据,因此,NumPy 并不适合用于科学计算之外的领域。
NumPy 的大部分代码是通过 C 语言进行编写的,这使得 NumPy 对数据的处理十分高效。
若你的计算机已经安装了 Python 的包管理器 PIP(Package Installer for Python),那么你可以通过如下命令来对 NumPy 进行下载安装。
pip install numpy
如果你需要在 Python 中使用 NumPy,请以这样的方式对其进行导入:
import numpy as np
NumPy 定义了一个 n 维数组对象,简称 ndarray(N Dimensional Array) 对象,它是一个一系列相同数据类型的元素组成的集合,数组中的每个元素均占有大小相同的内存块。
np.array() 可以将 Python 内置的序列对象转换为多维数组对象。
np.array(object, dtype = None, ndmin = 0)
其中:
项目 | 描述 |
---|---|
object | 需要转换为多维数组对象的 Python 内置对象。 |
dtye | 多维数组对象中的元素的数据类型。 |
ndmin | 规定多维数组的最低维度。 |
注:
请不要试图使用 np.array() 将数组及列表以外的 Python 内置结构转换为多维数组对象。如果需要这样做,请先将该数据结构转换为列表或元组。
虽然使用 np.array() 能够将数组及列表以外的 Python 内置结构转换为多维数组对象,但这样做并没有什么意义(多数情况下,np.array() 会将这类数据结构转换为包含单个该数据结构的一维数组)。
import numpy as np
arr = np.array({1, 3, 6})
print(arr)
print(type(arr))
打印结果:
{1, 3, 6}
错误
如果你试图对创建的数组进行运算,Python 将抛出错误信息,因为使用 np.array() 将集合转换为多维数组对象的结果是包含一个集合的一维数组对象。
import numpy as np
arr = np.array((1, 3, 6))
print(arr)
print(arr + 1)
print('---------------------------')
arr1 = np.array({1, 3, 6})
print(arr1)
print(arr1 + 1)
打印结果:
[1 3 6]
[2 4 7]
---------------------------
{1, 3, 6}
错误信息:
与 np.array() 类似的函数还有 np.asarray(),该函数与 np.arrary() 的功能类似,但该函数所支持的参数相比 np.arrary() 更少。
np.asarray(a, dtype=None)
其中:
a 为需要转换为多维数组对象的序列对象(列表或元组)。
使用 np.arange() 创建多维数组对象,我们可以达到与 Python 内建函数 range() 函数类似的效果。
np.arange([start, ]stop, [step, ]dtype=None)
其中:
项目 | 描述 |
---|---|
start | 起始值。 |
stop | 中止值。生成的多维数组对象中不包含中止值。 |
step | 步长。 |
dtype | 多维数组对象中的元素的数据类型。 |
举个栗子
import numpy as np
arr = np.arange(3, 37, 3)
print(arr)
打印结果:
[ 3 6 9 12 15 18 21 24 27 30 33 36]
NumPy 中提供了如下函数来生成包含随机数的多维数组对象(部分):
项目 | 描述 |
---|---|
np.random.randn() | 使用 np.random.randn() 函数你将从 均值为 0 方差为 1 的样本 中抽取指定数量的元素组成指定形状的多维数组对象。 |
np.random.normal() | 使用 np.random.normal() 函数可以从指定正态分布样本中抽取指定数量的数据以创建指定形状的多维数组对象。 |
np.random.choice() | 使用 np.random.choice() 函数可以从指定的 一维序列 中抽取指定数量的数据以创建指定形状的多维数组对象。 |
np.random.random() | 使用 np.random.random() 函数可以从 [0, 1) 的样本中抽取指定数量的数值用以创建指定形状的多维数组对象。 |
np.random.randint() | 你可以通过使用 np.random.randint() 从指定的范围的整数样本中抽取一定数量的数据以创建指定形状的多维数组对象。 |
np.random.shuffle() | 使用 np.random.shuflle() 函数能将传递给该函数的序列打乱顺序并创建相应的多维数组对象。 |
np.random.seed() | 你可以通过向 np.random.seed() 函数传递数值来设定使用的随机数种子。 |
使用 np.random.randn() 函数你将从 均值为 0 方差为 1 的样本 中抽取指定数量的元素组成指定形状的多维数组对象。
举个栗子
import numpy as np
arr = np.random.randn(2, 3, 3)
print(arr)
打印结果
[[[-0.0480595 0.56356363 -0.21505354]
[ 0.44823873 -1.11214077 -0.52324077]
[-0.19093371 0.05920201 -2.22010313]]
[[ 1.06321783 -0.17210113 0.65355918]
[-0.65389436 -0.76957588 1.17436737]
[ 1.06294231 0.79249734 0.1901463 ]]]
注:
当你没有提交实参给 np.random.randn() 函数时,该函数将返回仅包含一个元素(从 均值为 0 方差为 1 的样本 中抽取)的数组。
使用 np.random.normal() 函数可以从指定正态分布样本中抽取指定数量的数据以创建指定形状的多维数组对象。
np.random.normal(loc=0.0, scale=1.0, size=None)
其中:
项目 | 描述 |
---|---|
loc | 用于指定正态分布的期望值。 |
scale | 用于指定正态分布的标准差。 |
size | 用于指定生成的多维数组对象的形状,省略该参数将获得包含一个从指定正态分布样本中抽取的数据的多维数组对象。 |
举个栗子
import numpy as np
arr = np.random.normal(loc=0, scale=2, size=(2, 3))
print(arr)
打印结果:
[[ 1.01480683 4.4998025 5.78320235]
[-1.22391397 -0.26704833 2.15595718]]
使用 np.random.choice() 函数可以从指定的 一维序列 中抽取指定数量的数据以创建指定形状的多维数组对象。
np.random.choice(a, size=None, p=None)
其中:
项目 | 描述 |
---|---|
a | 指定一个一维序列作为样本。当你使用数值作为该形参对应的实参时,将自动使用 np.arange() (将数值作为该函数的参数)创建多维数组对象。 |
size | 指定创建的多维数组对象的形状。 |
p | 你可以通过该参数提供一个与样本相同长度的一维序列,该序列中的元素将与样本中的同位置元素一一对应,作为样本中对应元素被抽取到的概率。概率之和需要为 1,否则将抛出错误。 |
举个栗子
import numpy as np
arr = [1, 2, 3, 4]
result = np.random.choice(arr, size=(8, 8), p=[0.1, 0.1, 0.7, 0.1])
print(result)
打印结果:
[[1 1 3 2 3 3 3 2]
[3 3 3 3 3 3 1 4]
[3 4 1 3 4 3 4 3]
[3 3 3 3 2 3 3 3]
[2 3 3 3 1 1 2 4]
[3 3 1 3 3 3 3 3]
[3 3 3 3 1 3 3 2]
[3 3 4 3 3 2 2 3]]
使用 np.random.random() 函数可以从 [0, 1) 的样本中抽取指定数量的数值用以创建指定形状的多维数组对象。
np.random.random(size=None)
举个栗子
import numpy as np
result = np.random.random((1, 2))
print(result)
打印结果:
[[0.52577711 0.36884136]]
你可以通过使用 np.random.randint() 从指定的范围的整数样本中抽取一定数量的数据以创建指定形状的多维数组对象。
np.random.randint(low, high=None, size=None, dtype=int)
其中:
项目 | 描述 |
---|---|
low | 指定样本中整数的最小值,可以通过数组进行指定。 |
high | 指定样本中整数的最大值(样本中不包含最大值),可以通过数组进行指定。 |
size | 指定创建的多维数组对象的形状。 |
dtype | 指定多维数组对象中各个元素的数据类型。 |
如果 high 被省略,则样本数据中的整数范围为 [0, low) 。
创建一个包含最大整数为 9,最小整数为 3 的 3 * 3 多维数组对象
import numpy as np
result = np.random.randint(3, 10, size=(3, 3))
print(result)
打印结果:
[[5 7 4]
[9 5 8]
[8 8 9]]
创建一个包含最小整数分别为 2、3、4,最大整数分别为 7、8、9 的多维数组对象
import numpy as np
result = np.random.randint([2, 3, 4], [8, 9, 10])
print(result)
打印结果:
[3 8 7]
注:
如果最小值与最大值是多对多的情况,则提交给 np.random.randint() 函数的最小值与最大值相关的序列中的元素需要相同,否则 Python 将抛出错误。例如:
import numpy as np
result = np.random.randint([2, 3, 4], [8, 9])
print(result)
抛出错误:
创建一个包含最小整数分别为 2、3、4,最大整数分别为 7、8、9 的多维数组对象(指定形状)
import numpy as np
result = np.random.randint([2, 3, 4], [8, 9, 10], size=(4, 2, 3))
print(result)
打印结果:
[[[2 5 4]
[2 4 7]]
[[4 5 9]
[4 8 7]]
[[5 4 7]
[7 6 8]]
[[3 6 6]
[7 7 5]]]
注:
指定形状时,需要保证创建的多维数组对象中最低维度的数组的列数与传递给low 或 high 参数的数组中列数最多的那一个数组的列数保持一致,否则将抛出错误。例如:
import numpy as np
result = np.random.randint([2, 3, 4], [8, 9, 10], size=(4, 2, 4))
print(result)
抛出错误:
创建一个包含最小整数为 2,最大整数分别为 7、8、9 的多维数组对象(指定形状)
import numpy as np
result = np.random.randint(2, [8, 9, 10], size=(4, 2, 3))
print(result)
打印结果:
[[[6 8 7]
[5 2 9]]
[[4 8 9]
[2 4 8]]
[[7 7 8]
[6 5 5]]
[[4 2 2]
[2 2 9]]]
使用 np.random.shuflle() 函数能将传递给该函数的序列打乱顺序并创建相应的多维数组对象。
举个栗子
import numpy as np
arr = [1, 3, 6]
result = np.random.shuffle(arr)
print(arr)
print(result)
打印结果:
[3, 6, 1]
None
注:
该函数将会影响到原序列,请小心使用。
程序中产生的随机数均为伪随机数,因为这些随机数都是由具有确定性行为的算法根据随机数生成器中的随机数中子生成的。
你可以通过向 np.random.seed() 函数传递数值来设定使用的随机数种子。
举个栗子
import numpy as np
np.random.seed(3)
result = np.random.random((3, 4))
print(result)
多次执行上述代码,你都将获得如下打印结果:
[[0.5507979 0.70814782 0.29090474 0.51082761]
[0.89294695 0.89629309 0.12558531 0.20724288]
[0.0514672 0.44080984 0.02987621 0.45683322]]
你也可以不向 np.random.seed() 函数传递数值来取消对随机数种子的指定。
举个栗子
import numpy as np
np.random.seed(3)
np.random.seed()
result = np.random.random((3, 4))
print(result)
多次执行上述代码,你将获得不同的打印结果。
你可以使用 numpy.linspace() 函数用于创建一个包含等差数值的一维数组。
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
其中:
项目 | 描述 |
---|---|
start | 等差数列的起始值。 |
stop | 等差数列的终止值,如果参数 endpoint 为 True,则该值将被包含于数列中。 |
num | 等差数列中的元素个数。 |
endpoint | 该值为 True 时,等差数列中将包含 stop 参数对应的值。 |
retstep | 如果该参数的值为 True ,则生成的数组中将会显示间距。 |
dtype | 多维数组中各个元素的数据类型。 |
举个栗子
import numpy as np
arr = np.linspace(1, 36, num=20, retstep=True)
arr1 = np.linspace(1, 36, num=20)
print(arr)
print()
print(arr1)
打印结果:
(array([ 1. , 2.84210526, 4.68421053, 6.52631579, 8.36842105,
10.21052632, 12.05263158, 13.89473684, 15.73684211, 17.57894737,
19.42105263, 21.26315789, 23.10526316, 24.94736842, 26.78947368,
28.63157895, 30.47368421, 32.31578947, 34.15789474, 36. ]), 1.8421052631578947)
[ 1. 2.84210526 4.68421053 6.52631579 8.36842105 10.21052632
12.05263158 13.89473684 15.73684211 17.57894737 19.42105263 21.26315789
23.10526316 24.94736842 26.78947368 28.63157895 30.47368421 32.31578947
34.15789474 36. ]
你可以使用 numpy.linspace() 函数用于创建一个包含等差数值的一维数组。
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
其中:
项目 | 描述 |
---|---|
start | 等比数列的起始值为 start ** base。 |
stop | 等比数列的终止值 stop ** base,如果参数 endpoint 为 True,则该值将被包含于数列中。 |
num | 等比数列中的元素个数。 |
endpoint | 该值为 True 时,等比数列中将包含 stop 参数对应的值。 |
base | 指定等比数列的公比。 |
dtype | 多维数组中各个元素的数据类型。 |
举个栗子
import numpy as np
arr = np.logspace(1, 10, num=10, base=2)
print(arr)
打印结果:
[ 2. 4. 8. 16. 32. 64. 128. 256. 512. 1024.]
np.zeros() 函数可用于创建指定形状的多维数组,该数组中的元素均为 0。
np.zeros(shape, dtype=float)
其中
项目 | 描述 |
---|---|
shape | 用于指定多维数组对象的形状。 |
dtype | 用于指定多维数组对象中的元素的数据类型。如果省略该参数,将使用默认值 np.float64 。 |
举个栗子
import numpy as np
arr = np.zeros((3, 4))
print(arr)
打印结果:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
与 np.zeros() 类似的其他函数
项目 | 描述 |
---|---|
np.ones() | np.ones() 函数可用于创建指定形状的多维数组,该数组中的元素均为 1。 |
np.zeros_like() 函数可用于创建与指定序列相同形状的多维数组,该数组中的元素均为 0。
np.zeros_like(a, dtype=None, shape=None)
举个栗子
import numpy as np
arr = [[1, 2, 3], [4, 5, 6]]
result = np.zeros_like(arr)
print(result)
打印结果:
[[0 0 0]
[0 0 0]]
注:
当然你也可以通过该函数的 shape 属性来创建指定形状的数组。
import numpy as np
arr = [[1, 2, 3], [4, 5, 6]]
result = np.zeros_like(arr, shape=(2, 2))
print(result)
打印结果:
[[0 0]
[0 0]]
shape 指定的形状可以与传递给该函数的数组不同。
与 np.zeros_like() 类似的函数
项目 | 描述 |
---|---|
np.ones_like() | np.ones_like() 函数可用于创建与指定序列相同形状的多维数组,该数组中的元素均为 1。 |
np.full() 函数可用于创建指定形状的多维数组,并且你可以指定该数组中的所有元素的值。
np.full(shape, fill_value, dtype=None)
其中:
项目 | 描述 |
---|---|
shape | 用于指定多维数组对象的形状。 |
fill_value | 用于指定多维数组中所有元素的值。 |
dtype | 指定多维数组中元素的数据类型。 |
举个栗子
import numpy as np
arr = np.full((3, 6), fill_value=6)
print(arr)
打印结果:
[[6 6 6 6 6 6]
[6 6 6 6 6 6]
[6 6 6 6 6 6]]
np.full_like() 函数可用于创建与指定序列相同形状的多维数组,并且你可以指定该数组中的所有元素的值。
np.full_like(a, fill_value, dtype=None, shape=None)
注:
shape 指定的形状可以与传递给该函数的数组不同。
某些函数没有提供设定创建的多维数组对象的形状的参数,但我们可以通过使用 ndarray (即多维数组对象)对象的 reshape() 方法来修改多维数组对象的形状。
举个栗子
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
arr1 = arr.reshape((2, 3))
print(arr)
print()
print(arr1)
打印结果:
[1 2 3 4 5 6]
[[1 2 3]
[4 5 6]]
注:
ndarray 对象的 reshape() 方法并不会修改原数组,该方法将返回一个新的 ndarray 对象。