NumPy是一个开源的Python科学计算基础库,主要用于对大量数据进行高效存储和计算,提供了许多向量和矩阵操作,能够帮助轻松完成科学与工程中常用的各种计算,不仅方便易用而且效率更高。
PyTorch张量的语法与NumPy数组基本相同或相似,具体区别详见下文。
import numpy as np
数据分析与可视化基础 (1) :NumPy数组库
数据分析与可视化基础 (2) :Pandas标签库
数据分析与可视化基础 (3) :Matplotlib绘图库
1 NumPy数组基础
1.1 数据类型
一个NumPy数组只容纳一种数据类型,可分为整数型数组、浮点型数组和布尔型数组等。初始化时可通过设置dtype
属性来指定数据类型。
同化定理:往整数型数组里插入浮点数,该浮点数会自动被截断为整数;往浮点型数组里插入整数,该整数会自动升级为浮点数。
想实现整数型数组和浮点型数组的相互转换,可以使用.astype()
方法指定转换类型(PyTorch中为.type()
)。整数型数组在运算过程中升级为浮点型数组。
arr1 = np.array([1, 2, 3]) # 元素若都是整数,则为整数型数组
arr2 = np.array([1.0, 2, 3]) # 内含浮点数,则为浮点型数组
print(arr2.astype(int)) # 浮点型降级
print(arr1 + 10.0) # 整数型进行各种浮点运算会升级
print(arr1 / 1) # 整数型遇到除法也会升级(即使除以整数)
1.2 形状参数(shape)
不同维度的数组在外形上的表现为: n n n 维数组使用 n n n 层中括号表示。可以用形状参数来描述数组的形状:
- 一维数组的形状参数:
x
或(x,)
【例】[1, 2, 3]
的形状为3
或[3,]
- 二维数组的形状参数:
(x, y)
【例】[[1, 2, 3]]
的形状为(1, 3)
- 三维数组的形状参数:
(x, y, z)
【例】[[[1, 2, 3]]]
的形状为(1, 1, 3)
使用数组的shape
属性查看形状参数。
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(arr, arr.shape)
本文将一维数组称为向量, 二维数组称为矩阵。
可使用数组的重塑方法.reshape()
(或.resize()
来直接修改数组)对数组进行重塑,需要传入重塑后的形状参数(shape)。给定了其他维度的数值,剩下一个维度可以填-1
,让其自动计算。
1.3 数组初始化函数
1.3.1 创建指定数组:np.array()
当明确知道数组每一个元素的具体数值时,使用np.array()
函数将Python列表转化为NumPy数组。
arr1 = np.array([1, 2, 3]) # 创建向量
arr2 = np.array([[1, 2, 3]]) # 创建行矩阵
arr3 = np.array([[1], [2], [3]]) # 创建列矩阵
arr4 = np.array([[1, 2, 3], [4, 5, 6]]) # 创建矩阵
print(arr1, '\n')
print(arr2, '\n')
print(arr3, '\n')
print(arr4)
PyTorch中的torch.tensor()
用同样方式创建指定张量。NumPy的 n n n 维数组与PyTorch的 n n n 阶张量可相互转换:
# 数组arr转为张量ts
ts = torch.tensor(arr);
# 张量ts转为数组arr
arr = np.array(ts)
1.3.2 创建递增数组:np.arange()
使用np.arange()
函数创建递增数组,可设置左闭右开区间的两端点以及步长(默认步长为1)。(同Python的range()
函数)
arr1 = np.arange(10) # [0, 10)
arr2 = np.arange(-8, 8) # [-8, 8)
arr3 = np.arange(1, 21, 2) # [1, 21), 步长为2
print(arr1)
print(arr2)
print(arr3)
1.3.3 创建同值数组:np.zeros()、np.ones()
使用np.zeros()
函数创建零向量/全0数组,使用np.ones()
函数创建单位向量/全1数组。给全1矩阵乘以标量即得全为任意指定数值的矩阵。
arr1 = np.zeros(5) # 形状为5的零向量
arr2 = np.ones((1, 3)) # 形状为(1, 3)的全1矩阵
arr3 = 3.14 * np.ones((3, 4)) # 形状为(3, 4)的元素全为3.14的矩阵
print(arr1, '\n')
print(arr2, '\n')
print(arr3)
1.3.4 创建随机数组:np.random系列
使用np.random
系列函数创建随机数组
np.random.random()
:返回0~1均匀分布的浮点型随机数组,需传入形状参数。可进一步操作实现生成任意范围内的随机浮点数。(PyTorch中为torch.rand()
)
arr1 = np.random.random(10)
arr2 = (100 - 60) * np.random.random((3, 3)) + 60 # 创建60~100均匀分布的随机数组
print(arr1, '\n')
print(arr2)
np.random.randint()
:创建整数型随机数组,在指定形状参数之前还需额外输入范围参数。(PyTorch中为torch.randint()
,且不接纳一维向量)
arr1 = np.random.randint(10, 100, (3, 5)) # 元素为[10, 100)上的整数型随机数
print(arr1)
np.random.normal()
:生成服从正态分布的随机数组,在指定形状参数之前还需额外输入正态参数,即均值、方差。(PyTorch中为torch.normal()
,且不接纳一维向量)np.random.randn()
:直接生成服从标准正态分布(均值为0、方差为1)的随机数组,只需指定形状参数。(PyTorch中为torch.randn()
)
arr1 = np.random.randn(3, 4) # 等价于 np.random.normal(0, 1, (3, 4))
print(arr1)
1.3.5 其他常用的创建方法
np.empty(shape)
:内存创建。分配数组大小内存,而不产生实际值。具有相同效果的还有有empty_like()
函数。np.full(shape, val)
:填充创建。指定数组形状,再指定一个数填充入该结构中。np.linspace(start, end, num=50)
:等差数组创建,生成从start
到end
上的num
个数的等差数列。参考arange()
函数。np.logspace(start, end, num=50, base=10)
:等比数组创建,生成从start * base
到end * base
上的num
个数的等比数列。参考arange()
函数。ones_like(a)
、zeros_like(a)
、full_like(a, val)
:根据所传入数组的形状创建
2 数组的索引
2.1 访问数组元素
与Python列表基本一致,访问NumPy数组元素时使用中括号,索引由0开始。
arr1 = np.arange(1, 10)
print(arr1)
print(arr1[3], arr1[-1])
arr1[5] = 99.8 # 元素可被修改;浮点数插入到整数型数组时会被截断
print(arr1)
访问多维数组时,只使用1个中括号,各维索引之间用逗号分隔即可。
arr1 = np.arange(