Python深度学习个人库Numpy笔记系列(第一篇)
一.Numpy库简介
NumPy 是 Python 中进行科学计算和数值处理的基础库,提供了高性能的多维数组对象(ndarray)和大量针对数组的操作函数。
1.1功能应用
- 允许不同形状的数组在数学运算中“自动扩展”以便执行矢量化运算。使得代码更简洁、运算更高效。
- 支持对整个数组执行元素级的操作,避免使用 Python 的循环,从而显著提升性能。
- 包括基本的算术运算、三角函数、指数函数、对数函数等,均以“通用函数(ufuncs)”的形式提供,这些函数对数组内每个元素进行操作。
- NumPy 提供了矩阵乘法、求逆、特征值分解、奇异值分解等丰富的线性代数操作,支持高效的矩阵计算。
- 支持生成各种分布的随机数据,常用于模拟、数据采样等场景。
- 支持使用整数、布尔值、切片、甚至多维数组进行高效索引与切片操作,极大地方便了数据选取与处理。
二.数组创建
2.1创建普通数组
函数:np.array()
功能:将列表、元组或其他序列转换为 ndarray 对象
()中间还需要[]括起来要创建的数组,不同[]直接用,隔开,表示多维数组
一维数组:
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr)
二维数组:
import numpy as np
arr = np.array([[1, 2], [3, 4]])
print(arr)
2.2特殊数组
2.2.1全零数组
函数:np.zeros(shape)
功能:创建一个指定形状的数组,并用零填充。
import numpy as np
arr = np.zeros([2,4])
print(arr)
2.2.2全一数组
函数:np.ones(shape)
功能:创建一个指定形状的数组,并用1填充
import numpy as np
arr = np.ones([2,4,3])
print(arr)
2.2.3指定形状数组
函数:np.empty(shape)
功能:创建一个指定形状的数组,但只分配内存空间不赋值
import numpy as np
arr = np.empty([2,4])
print(arr)
2.2.4等差序列数组
函数:np.arange(start,stop,step)
功能:创建一个等差数列的数组,从start开始创建,步长为step,最后不包括stop
import numpy as np
data = np.arange(start,stop,step)
print(data)
2.2.5等间隔数组
函数:np.linspace(start, stop, num)
功能:从start开始,到stop结束,创建共num个元素的数组。在指定区间内生成等间隔的数值,返回数组
import numpy as np
arr = np.linspace(0, 1, 5)
print(arr)
np.arange和np.linspace的区别:
1.arrange最后一个参数为步长,明确知道步长,且不包含stop的值
2.linspace最后一个参数为个数,需要确定的样本数量,并希望stop也包含
表 1 函数区别
|
特性 |
np.arange |
np.linspace |
|
区间类型 |
半开区间 [start, stop) |
闭区间 [start, stop] |
|
控制方式 |
步长 step 控制 |
元素数量 num 控制 |
arr1 = np.arange(2,10,2) #[2 4 6 8]
arr2 = np.linspace(0, 1, 5) #[0.0, 0.25, 0.5, 0.75, 1.0]
2.2.6随机数组
函数:np.random.rand(n,m):创建n行m列数组,内容随机,范围为0-1
import numpy as np
data = np.random.rand(3,4)
print(data)
函数: np.random.randint(a,b,size=(n,m)):创建n行m列数组,内容随机,范围为a-b(不包括b)
import numpy as np
data=np.random.randint(2,5,size=(4,5));
print(data)
三.数组基本操作
NumPy 支持对数组进行逐元素的加、减、乘、除等运算,称为向量化运算
3.1数组形状与重构
1.array.shape:获取数组形状(行数,列数)
import numpy as np
data=np.array([[1,2],[2,4]]);
print(data.shape) #(2, 2)
2.array.reshape(new_shape):返回一个新视图,将数组重构为指定形状(总元素个数必须一致)
import numpy as np
data=np.array([[1,2],[2,4]]);
print(data.reshape(1,4)) #[[1 2 2 4]]
3.array.astype(type) :改变数组格式(type输入int,float就可以改为指定格式)
import numpy as np
data=np.array([1,2])
print(data.astype(float)) #[1. 2.]
4.array.dtype: 获取数组数据类型
import numpy as np
data=np.array([1,2])
print(data.dtype) #int32
5.array.T:返回转置后的数组(二维数组常用)
6.array.ndim: 获取数组维度(一维或者二维)
import numpy as np
data=np.random.rand(2,5,3)
print(data.ndim) #3
7.array.size: 获取数组元素个数
import numpy as np
data=np.random.rand(4,5,3)
print(data.size) #60
3.2常用统计函数
1.np.sum(arr):求数组所有元素之和
2.np.mean(arr):求平均值
3.np.median(arr):求中位数
4.np.min(arr) 与 np.max(arr):求最小和最大值
import numpy as np
data=np.array([[4,8,9],[6,7,1],[2,3,5]])
print(data.sum()) #45
print(data.mean()) #5.0
print(data.max()) #9
print(data.min()) #1
print(np.median(data)) #5.0
5.np.std(arr, axis=None, dtype=None, out=None):计算数组的标准差(std: standard deviation)。参数axis、dtype和out的含义与numpy.mean()相同
6.np.var(arr, axis=None, dtype=None, out=None):计算数组的方差(var: variance)。参数axis、dtype和out的含义与numpy.mean()相同
7.np.prod(arr, axis=None, dtype=None, out=None):计算数组的元素乘积(prod: product)。参数axis、dtype和out的含义与numpy.mean()相同
8.np.cumsum(arr, axis=None, dtype=None, out=None):计算数组的累积和(cumsum: cumulative sum)。参数axis、dtype和out的含义与numpy.mean()相同
import numpy as np
data=np.array([[4,8,9],[6,7,1],[2,3,5]])
print(data.std()) #2.581988897471611
print(data.var()) #6.666666666666667
print(data.prod()) #362880
print(data.cumsum()) #[ 4 12 21 27 34 35 37 40 45]
3.3线性代数
需要导入子模块numpy.linalg,提供了高效的矩阵运算功能,包括矩阵求逆、特征值计算、行列式、解线性方程组等
1.np.dot(a, b) 或 a.dot(b):矩阵乘法(向量点乘)
import numpy as np
arr1 = np.array([[1,-1,3],[0,1,2],[0,0,2]])
arr2 = np.array([[7,4,-1],[4,7,-1],[-4,8,4]])
print(np.dot(arr1,arr2))
"""
[[-9 21 12]
[-4 23 7]
[-8 16 8]]
"""
2.np.linalg.inv(a):矩阵求逆。
3.np.trace(a):求矩阵的迹
4.np.linalg.det(a):求矩阵行列式
5.np.linalg.norm(a):计算向量或矩阵的范数(默认为L2欧几里得范数)
6.np.linalg.solve(a,b): 求解线性方程组 ax = b,其中 A 为系数矩阵,b 为常数向量
import numpy as np
a= np.array([[2, 1, 0, 0],[1, 2, 1, 0],[0, 1, 2, 1],[0, 0, 1, 2]])
b = np.array([1, 2, 3, 4])
print(np.linalg.inv(a))
print(np.trace(a))
print(np.linalg.det(a))
print(np.linalg.norm(a))
print(np.linalg.solve(a,b))
7.np.linalg.eig(a): 计算方阵的特征值和特征向量
import numpy as np
data=np.array([[1,-1,3],[0,1,2],[0,0,2]])
eig1,eig2=np.linalg.eig(data)
eig1=np.round(eig1,2)
eig2=np.round(eig2,2)
print(eig1) #[1. 1. 2.]
print(eig2)
"""
[[1. 1. 0.41]
[0. 0. 0.82]
[0. 0. 0.41]]
"""
8.np.linalg.eigh(a): 针对对称矩阵优化的特征分解
import numpy as np
a = np.array([[2, 1, -1],[1, 3, 0],[-1, 0, 1]])
eigh1,eigh2 = np.linalg.eigh(a)
eigh1 = np.round(eigh1,3)
eigh2 = np.round(eigh2,3)
print(eigh1)
print(eigh2)
3.4切片操作
3.4.1一维数组切片
函数:array[start:stop+1]
通过指定起始位置和结束位置来获取数组中的一部分元素,切片操作是左闭右开的,即包括起始位置,但不包括结束位置
import numpy as np
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90])
print(arr[2:6]) # [30 40 50 60]
print(arr[:5]) # [10 20 30 40 50]
print(arr[5:]) # [60 70 80 90]
print(arr[::2]) # [10 30 50 70 90]
print(arr[::-1]) # [90 80 70 60 50 40 30 20 10]
print(arr[-3:]) # [70 80 90]
print(arr[-5:-2]) # [50 60 70]
3.4.2多维数组切片
函数:array[row_slice, col_slice]
在多维数组切片中,每个逗号,分隔的部分对应一个维度,: 表示该维度上所有的元素,不包含最后结尾,前后没有数字表示获取当前维度全部元素。具体的索引或切片操作则决定了选取哪部分数据。
import numpy as np
arr_2d = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
])
print(arr_2d[1:3, 2:4]) # [[ 7 8], [11 12]]
print(arr_2d[:, 1:3]) # [[ 2 3], [ 6 7], [10 11], [14 15]]
print(arr_2d[2:, :]) # [[ 9 10 11 12], [13 14 15 16]]
print(arr_2d[-1:, -1:]) # [[ 16 ]]
print(arr_2d[::2, :]) # [[ 1 2 3 4], [ 9 10 11 12]]
arr_3d = np.array([
[[1, 2], [3, 4]],
[[5, 6], [7, 8]]
])
print(arr_3d[0, :, :]) # [[ 1 2], [ 3 4]]
print(arr_3d[:, 0, :]) # [[ 1 2], [ 5 6]
print(arr_3d[:, :, 1]) # [[ 2 4], [ 6 8]]
作者:孜宸润泽