NumPy的基础知识

NumPy库的基本含义

NumPy(Numerical Python)是Python的一种开源科学计算库。NumPy数组通过连续内存存储实现高性能运算,支持轴(axis)操作和广播机制,内置数据类型可与C语言对应。底层采用C语言编写,能与C/C++、Fortran代码交互。主要包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合C/C++/Fortran代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

NumPy是SciPy、Pandas等数据处理或科学计算库的基础

NumPy库的引用

import numpy as np

N维数组对象:ndarray

  • 数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据
  • 设置专门的数组对象,经过优化,可以提升这类应用的运算速度
  • 科学计算中,一个维度所有数据的类型往往相同
  • 数组对象采用相同的数据类型,有助于节省运算和存储空间

mdarray是一个多维数组对象,由两部分组成:实际的数据、描述这些数据的元数据(数据维度、数据类型等)

ndarray数组一般要求所有元素类型相同(同质),数组小标从0开始

例子:

import numpy as np
#np.array() 生成一个ndarray数组
a = np.array([[0,1,2,3,4],[9,8,7,6,5]])
print(a)

![[image.png]]

轴(axis):保存数据的维度;秩(rank):轴的数量

ndarray对象的属性
属性说明
.ndim秩,即轴的数量或维度的数量
.shapendarray对象的尺度,对于矩阵,n行m列
.sizendarray对象的个数,详单于.shape中n*m的值
.dtypendarray对象的元素类型
.itemsizendarray对象中每个元素的大小,以字节为单位
import numpy as np

a = np.array([[0,1,2,3,4],[9,8,7,6,5]])
print(a.ndim)
print(a.shape)
print(a.dtype)
print(a.itemsize)
print(a.size)

​​![[image 1.png]]

ndarray的元素类型
数据类型说明
bool布尔类型,True或False
intc与C语言中的int类型一致,一般是int32或int64
intp用于索引的整数,与C语言中ssize_t一致,int32或int64
int8字节长度的整数,取值:[ ‐128, 127]
int1616位长度的整数,取值:[ ‐32768, 32767]
int3232位长度的整数,取值:[ ‐ 231, 231‐1]
int6464位长度的整数,取值:[ ‐ 263, 263‐1]
uint88位无符号整数,取值:[0, 255]
uint1616位无符号整数,取值:[0, 65535]
uint3232位无符号整数,取值:[0, 232‐1]
uint6432位无符号整数,取值:[0, 264‐1]
float1616位半精度浮点数:1位符号位,5位指数,10位尾数
float3232位半精度浮点数:1位符号位,8位指数,23位尾数
float6464位半精度浮点数:1位符号位,11位指数,52位尾数
complex64复数类型,实部和虚部都是32位浮点数
complex128复数类型,实部和虚部都是64位浮点数

指数:(符号)尾数*10指数

复数:实部(.real) + j虚部(.imag)

对比:Python语法仅支持整数、浮点数和复数3种类型

科学计算涉及数据较多,对存储和性能都有较高的要求

对元素类型精细定义,有助于NumPy合理使用存储空间并优化

对元素类型精细定义,有助于程序员对程序规模由合理评估

x = np.array([[0,1,2,3,4],[9,8,7,6,5]])
print(x.shape)
b = np.array([[0,1,2,3,4],[9,8,7,6]],dtype=object)
print(b.shape)
a = np.array([[0,1,2,3,4],[9,8,7,6]])
print(a.shape)

​​
![[image 2.png]]

ndarray数组可以由非同质对象构成,但是如果不指名数据类型会报错。因此非同质ndarray对象无法有效发挥NumPy优势,尽量避免使用。

ndarray数组的创建方法
  • 从Python中的列表、元组等类型创建ndarray数组
  • 使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等
  • 从字节流(raw bytes)中创建ndarray数组
  • 从文件中读取特定格式,创建ndarray数组

1、从Python中的列表、元组等类型创建ndarray数组

x = np.array(list/tuple)
x = np.array(list/tuple, dtype=np.float32)
当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型
import numpy as np

x = np.array([0,1,2,3])  #从列表类型创建
print(x)
x = np.array((4,5,6,7))  #从元组类型创建
print(x)
x = np.array([[1,2],[8,9],(0.1,0.2)])  #从列表和元组混合类型创建
print(x)

​![[image 3.png]]

2、使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等

函数说明
np.arange(n)类似range()函数,返回ndarray类型,元素从0到n ‐ 1
np.ones(shape)根据shape生成一个全1数组,shape是元组类型
np.zeros(shape)根据shape生成一个全0数组,shape是元组类型
np.full(shape,val)根据shape生成一个数组,每个元素值都是val
np.eye(n)创建一个正方的n*n单位矩阵,对角线为1,其余为0
import numpy as np

x = np.arange(10)
print(x)
x = np.ones((3,6))
print(x)
x = np.zeros((3,6),dtype=np.int32)
print(x)
x = np.eye(5)
print(x)
x = np.ones((2,3,4))
print(x)
print(x.shape)

​![[image 4.png]]​

函数说明
np.ones_like(a)根据数组a的形状生成一个全1数组
np.zeros_like(a)根据数组a的形状生成一个全0数组
np.full_like(a,val)根据数组a的形状生成一个数组,每个元素值是val
np.linspace()根据起止数据等间距地填充数据,形成数组
np.concatenate()将两个或多个数组合并成一个新的数组
import numpy as np

a = np.linspace(1,10,4)
print(a)
b = np.linspace(1,10,4,endpoint=False)
print(b)
c = np.concatenate((a,b))
print(c)

​![[image 5.png]]​

ndarray数组的变换

对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换

ndarray数组的维度变换

方法说明
.reshape(shape)不改变数组元素,返回一个shape形状的数组,原数组不变
.resize(shape)与.reshape()功能一致,但修改原数组
.swapaxes(ax1,ax2)将数组n个维度中两个维度进行调换
.flatten()对数组进行降维,返回折叠后的一维数组,原数组不变
import numpy as np

a = np.ones((2,3,4),dtype=np.int32)
print(a)
print(a.reshape((3,8)))
print(a)
a.resize((3,8))
print(a)
print(a.flatten())
print(a)

​![[image 6.png]]​

ndarray数组的类型变换

new_a = a.astype(new_type)
import numpy as np

a = np.ones((2,3,4),dtype = np.int8)
print(a)
b = a.astype(np.float16)
print(b)

​![[image 7.png]]​

ndarray数组向列表的转换

import numpy as np

a = np.full((2,3,4),25,dtype=np.int32)
print(a)
a.tolist()
print(a)
print(a.dtype)

​![[image 8.png]]​

ndarray数组的操作

数组的索引和切片

索引:获取数组中特定位置元素的过程

切片:获取数组元素子集的过程

一维数组的索引和切片:与Python的列表类似

import numpy as np

a = np.array([9,8,7,6,5])
print(a[2])
print(a[1:4:2]) #起始编号:终止编号(不含):步长,3元素冒号分割
#编号0开始从左递增,或-1开始从右递减

​![[image 9.png]]​

多维数组索引

import numpy as np

a = np.arange(24).reshape(2,3,4)
print(a)
print(a[1,2,3])
print(a[0,1,2])

​![[image 10.png]]​

多维数组的切片

import numpy as np

a = np.arange(24).reshape(2,3,4)
print(a)
print(a[:,1,-3])  #选取一个维度用冒号
print(a[:,1:3,:])  #每个维度切片方法与一维数组相同
print(a[:,:,::2])  #每个维度可以使用步长跳跃切片

​![[image 11.png]]​

ndarray数组的运算

数组与标量之间的运算作用于数组的每一个元素

NumPy一元函数

对ndarray中的数据执行元素级运算的函数

函数说明
np.abs(x) np.fabs(x)计算数组各元素的绝对值
np.sqrt(x)计算数组各元素的平方根
np.square(x)计算数组各元素的平方
np.log(x) np.log10(x) np.log2(x)计算数组各元素的自然对数、10底对数和2底对数
np.ceil(x) np.floor(x)计算数组各元素的ceiling值 或 floor值
np.rint(x)计算数组各元素的四舍五入值
np.modf(x)将数组各元素的小数和整数部分以两个独立数组形式返回
np.cos(x) np.cosh(x)
np.sin(x) np.sinh(x)
np.tan(x) np.tanh(x)
计算数组各元素的普通型和双曲型三角函数
np.exp(x)计算数组各元素的指数值
np.sign(x)计算数组各元素的符号值,1(+), 0, ‐1(‐)
import numpy as np

a = np.arange(24).reshape(2,3,4)
print(a)
print(np.square(a))
print(np.sqrt(a))
print(np.modf(a))

​![[image 13.png]]

​![[image 14.png]]​

NumPy二元函数

函数说明
+ ‐ * / **两个数组各元素进行对应运算
np.maximum(x,y) np.fmax()
np.minimum(x,y) np.fmin()
元素级的最大值/最小值计算
np.mod(x,y)元素级的模运算
np.copysign(x,y)将数组y中各元素值的符号赋值给数组x对应元素
> < >= <= == !=算术比较,产生布尔型数组
import numpy as np

a = np.arange(24).reshape(2,3,4)
#print(a)
b = np.sqrt(a)
#print(b)
print(a>b)

​![[image 15.png]]​

<think>我们正在讨论深度学习领域中NumPy基础知识。根据引用[1]和引用[2],NumPy在深度学习数据准备中扮演关键角色,它提供了强大的多维数组对象和高效的数值运算功能。引用[3]虽然重点在矩阵求逆,但也强调了NumPy在科学计算中的核心地位。 对于深度学习,NumPy基础知识主要包括: 1. 多维数组(ndarray)的创建和操作 2. 数组的索引和切片 3. 数组的数学运算(包括广播机制) 4. 线性代数运算(如矩阵乘法、求逆等) 5. 随机数生成 由于深度学习中的数据通常表示为多维数组(例如图像数据是3维:高度、宽度、通道数),因此掌握NumPy数组操作是必不可少的。 下面我将详细讲解这些基础知识,并附上代码示例。注意:代码示例中的注释是为了帮助理解,实际运行时请确保环境已安装了NumPy(通常通过`pip install numpy`安装)。 ### 1. 多维数组的创建 NumPy的核心是`ndarray`对象,即N维数组。我们可以使用`numpy.array()`函数从Python列表创建数组。 ```python import numpy as np # 创建一维数组 arr1d = np.array([1, 2, 3, 4]) print("一维数组:\n", arr1d) # 创建二维数组(矩阵) arr2d = np.array([[1, 2, 3], [4, 5, 6]]) print("二维数组:\n", arr2d) # 创建全0数组 zeros_arr = np.zeros((2, 3)) # 2行3列 print("全0数组:\n", zeros_arr) # 创建全1数组 ones_arr = np.ones((3, 2)) # 3行2列 print("全1数组:\n", ones_arr) # 创建单位矩阵 eye_arr = np.eye(3) # 3x3单位矩阵 print("单位矩阵:\n", eye_arr) # 创建等差数列数组 linspace_arr = np.linspace(0, 10, 5) # 0到10之间等间隔的5个数 print("等差数列数组:\n", linspace_arr) ``` ### 2. 数组的索引和切片 与Python列表类似,但NumPy数组支持多维索引和切片。 ```python # 二维数组索引和切片示例 arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 获取第一行 row0 = arr[0] # 或 arr[0, :] print("第一行:", row0) # 获取第一列 col0 = arr[:, 0] print("第一列:", col0) # 获取子矩阵(前两行,后两列) sub_arr = arr[:2, 1:] print("子矩阵:\n", sub_arr) ``` ### 3. 数组的数学运算 NumPy支持逐元素的数学运算,并支持广播机制(允许不同形状的数组进行运算)。 ```python a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) # 逐元素加法 c = a + b print("逐元素加法:\n", c) # 逐元素乘法 d = a * b print("逐元素乘法:\n", d) # 矩阵乘法(注意:不是逐元素乘) e = np.dot(a, b) # 或 a @ b (Python 3.5+) print("矩阵乘法:\n", e) # 广播示例:数组与标量 f = a * 3 print("数组乘以标量:\n", f) # 广播示例:不同形状数组 g = np.array([10, 20]) h = a + g # g被广播为[[10,20],[10,20]],然后与a逐元素相加 print("广播加法:\n", h) ``` ### 4. 线性代数运算 NumPy提供了丰富的线性代数函数,在`numpy.linalg`模块中。 ```python from numpy.linalg import inv # 矩阵求逆 matrix = np.array([[1, 2], [3, 4]]) matrix_inv = inv(matrix) print("矩阵的逆:\n", matrix_inv) # 验证逆矩阵:原矩阵乘逆矩阵应得到单位阵 identity_check = matrix @ matrix_inv print("验证逆矩阵(接近单位矩阵):\n", np.round(identity_check, 10)) # 四舍五入到小数后10位,消除浮点误差 ``` ### 5. 随机数生成 在深度学习中,随机数常用于初始化权重。NumPy提供了随机数生成功能。 ```python # 生成随机整数 random_int = np.random.randint(0, 10, size=(2,3)) # 0到10之间(不含10)的随机整数,形状2x3 print("随机整数矩阵:\n", random_int) # 生成标准正态分布随机数 normal_random = np.random.randn(3, 2) # 均值为0,方差为1的正态分布,3x2 print("标准正态分布随机数:\n", normal_random) # 设置随机种子(保证可重复性) np.random.seed(42) a = np.random.randn(2,2) np.random.seed(42) b = np.random.randn(2,2) print("设置相同种子,两个随机数组是否相等:", np.array_equal(a, b)) # 应该相等 ``` ### 实际应用场景 在深度学习中,NumPy常用于: - 加载和预处理数据(如图像归一化) - 实现自定义层或损失函数 - 进行数值计算(如前向传播和反向传播的梯度计算) - 数据增强(如随机旋转、裁剪图像) 例如,图像数据通常表示为形状为(高度, 宽度, 通道数)的三维数组。我们可以使用NumPy进行归一化: ```python # 假设image是一个形状为(128,128,3)的数组,像素值范围0-255 image = np.random.randint(0, 256, size=(128,128,3), dtype=np.uint8) # 归一化到0-1范围 normalized_image = image / 255.0 print("归一化后的图像数据(第一像素的第一个通道):", normalized_image[0,0,0]) ``` 以上涵盖了深度学习所需的NumPy基础知识。掌握这些内容后,你可以更高效地处理数据并实现深度学习算法[^1][^2]。 §§相关问题§§ 1. NumPy数组与Python列表的主要区别是什么? 2. 在深度学习中,NumPy通常用于哪些数据处理任务? 3. 如何使用NumPy实现简单的线性回归? </think>### NumPy在深度学习中的基础知识 NumPy(Numerical Python)是Python科学计算的核心库,在深度学习领域扮演着关键角色,主要用于**高效处理多维数组数据**。以下深度学习所需的NumPy核心知识点: #### 1. 多维数组(ndarray) 深度学习数据的基本表示形式,如图像(3D:高度×宽度×通道)、视频(4D:帧×高度×宽度×通道)等 ```python import numpy as np # 创建数组 images = np.random.rand(100, 28, 28, 3) # 100张28x28的RGB图像 weights = np.zeros((256, 512)) # 神经网络权重矩阵 # 查看维度 print(images.shape) # 输出: (100, 28, 28, 3) ``` #### 2. 核心操作 - **索引切片**:提取数据子集 ```python # 提取第1张图像的全部通道 img0 = images[0, :, :, :] # 提取所有图像的红色通道 red_channel = images[:, :, :, 0] ``` - **广播机制**:自动对齐不同形状数组的运算 ```python A = np.array([[1,2], [3,4]]) B = np.array([10,20]) print(A + B) # 输出: [[11,22],[13,24]] ``` #### 3. 数学运算 深度学习涉及的关键计算: ```python # 矩阵乘法(神经网络前向传播) X = np.random.rand(64, 256) # 输入数据(64样本×256特征) W = np.random.rand(256, 128) # 权重矩阵 output = X.dot(W) # 矩阵乘法 # 激活函数应用 def relu(x): return np.maximum(0, x) # ReLU激活函数 # 统计计算(数据预处理) data = np.random.normal(loc=0, scale=1, size=(1000, 10)) mean = np.mean(data, axis=0) # 按列求均值 std = np.std(data, axis=0) # 按列求标准差 normalized = (data - mean) / std ``` #### 4. 内存优化技巧 提升深度学习数据处理效率: ```python # 视图操作(零拷贝) arr = np.arange(10) # [0,1,2,...,9] view = arr[::2] # [0,2,4,6,8] (不复制数据) # 高效赋值 arr = np.zeros((1024,1024)) arr[:, 1::2] = 1 # 奇数列赋值为1 ``` #### 5. 深度学习应用场景 1. **数据预处理**:归一化、标准化、数据增强 2. **模型权重存储**:全连接层权重矩阵(2D)、卷积核(4D) 3. **自定义层实现**:手动实现激活函数、损失函数 4. **梯度计算**:通过`np.gradient`进行数值微分 ```python # 均方误差损失函数实现 def mse_loss(y_true, y_pred): return np.mean(np.square(y_true - y_pred)) ``` #### 6. 性能优势 - **矢量化运算**:比Python循环快100倍以上 - **内存连续存储**:优化CPU缓存利用率 - **底层C实现**:避免Python解释器开销 > NumPy的多维数组操作是PyTorch/TensorFlow等深度学习框架的底层基础。掌握NumPy不仅能提升数据操作效率,还能深入理解深度学习框架的工作原理[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

注释写满人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值