Numpy基础学习

本文深入探讨Numpy的基础知识,涵盖数组创建、操作、索引、切片、属性及数组转换等内容,详解一维与多维数组的管理技巧。

Numpy基础学习(一)

Numpy基础学习

本文主要内容来自《Python数据分析基础教程 NumPy学习指南》第二版,建议直接阅读该书。

import numpy as np

#创建一维数组
a = np.arange(5)
print(a)#[0 1 2 3 4]
print(a.dtype)#int64
print(a.shape)#(5,);shape属性返回一个元组(tuple),元组中的每个元素代表一个维度上的大小。

#创建多维数组
m = np.array([np.arange(3),np.arange(3),np.arange(3)])
print(m)#[[0 1 2][0 1 2] [0 1 2]]
print(m.shape)#(3 3 3)
#选取数组元素
#嵌套的列表
print(m[0,0])#0

#Numpy数据类型及转化函数
#float16,float32,float64或float,inti,int8,int16,int32,int64,uint8,uint16,uint32,uint64,,bool,complex64,complex128或complex

#复数是不能转换成整数,浮点数,会触发TypeError;但浮点数可以转换为复数列如,complex(1.0)

#单个元素在内存中占用的字节数
print(a.dtype.itemsize)#8

#字符编码 整数i,无符号整数u,单精度浮点数f,双精度浮点数d,布尔值b,复数D,字符串str,unicode字符串U,void(空)V
f = np.arange(7,dtype='f')
print(f)#[0. 1. 2. 3. 4. 5. 6.]
s = f.astype('str')
print(s)#['0.0' '1.0' '2.0' '3.0' '4.0' '5.0' '6.0']

#自定义数据类型数组
t = np.dtype([('name','str',40),('numitems', 'int32'),('price','float32')])
print(t)
itemz = np.array([('M',42,3.14),('b',13,2.72)],dtype=t)
print(itemz[1])#('b', 13, 2.72)

#一维数组的索引和切片
a = np.arange(9)
#用下标3-7来选取元素3-6
b = a[3:7]
print(a,b)#[0 1 2 3 4 5 6 7 8] [3 4 5 6]
#用下标0-7,以2为步长选取元素
print(a[:7:2])#[0 2 4 6]
#用负数下标翻转数组
print(a[::-1])#[8 7 6 5 4 3 2 1 0]

#多维数组的切片和索引
b = np.arange(24).reshape(2,3,4)
print(b)
'''
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
  用三维数组b,来表示楼层,行,列
'''
#选取所有楼层的第一行,第一列
print(b[:,0,0])#[ 0 12]
#选取第一层
print(b[0])
#或
print(b[0,:,:])
#或
print(b[0,...])
'''[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
 '''
#将第一楼层第2排的进行切片
print(b[0,1])#[4 5 6 7]
print(b[0,1,::2])#[4 6]
print(b[0,1,::3])#[4 7]
print(b[0,1,:2])#[4 5]
#不指定楼层,获取第2列的房间
print(b[...,1])
print(b[:,1])
'''[[ 4  5  6  7]
 [16 17 18 19]]
 '''
#获取第一层楼,所有位于第二列的房间
print(b[0,:,1])#[1 5 9]
#获取第一层楼,所有位于最后一列的房间
print(b[0,:,-1])#[ 3  7 11]
#反向选取第一层楼最后一列的所有房间
print(b[0,::-1,-1])#[11  7  3]
print(b[0,::2,-1])#[ 3 11]

#改变数组的维度
#使用ravel函数展平数组,不会保存结果,返回数组的一个视图
print(b.ravel())#[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
print(b)
''' [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
'''
#使用flatten函数展平数组,会保存结果
print(b.flatten())
print(b)
#用元组设置维度,reshape设置维度,resize(会直接修改所操作的数组)
b.shape = (6,4)
print(b)
'''[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]
 '''
print(b.reshape(6,4))
'''[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]
 '''
# print(b.resize(2,12))
# print(b)
'''
[[ 0  1  2  3  4  5  6  7  8  9 10 11]
 [12 13 14 15 16 17 18 19 20 21 22 23]]
'''

#transpose  转置矩阵在线性代数中,操作很常见
# print(b.transpose())
'''[[ 0  4  8 12 16 20]
 [ 1  5  9 13 17 21]
 [ 2  6 10 14 18 22]
 [ 3  7 11 15 19 23]]
 '''

#数组的组合,包括水平组合,垂直组合和深度组合方式,将使用vstack,dstack,hstack column_stack,row_stack 以及concatenate函数完成数组的组合
#创建数组
a = np.arange(9).reshape(3,3)
b = 2 * a

# print(a,b)
'''
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
'''
#水平组合hstack,concatenate
print(np.hstack((a,b)))
print(np.concatenate((a,b),axis=1))
'''
[[ 0  1  2  0  2  4]
 [ 3  4  5  6  8 10]
 [ 6  7  8 12 14 16]]
'''
#垂直组合
print(np.vstack((a,b)))
print(np.concatenate((a,b),axis=0))
'''
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
'''
#深度组合,将一系列数组沿纵轴方向层叠组合
print(np.dstack((a,b)))
'''
[[[ 0  0]
  [ 1  2]
  [ 2  4]]

 [[ 3  6]
  [ 4  8]
  [ 5 10]]

 [[ 6 12]
  [ 7 14]
  [ 8 16]]]
'''
#列组合column_stack对于一维数组按列的方向组合,二维数组和hstack 效果一样。
oned = np.arange(2)
twice = 2*oned

print(np.column_stack((oned,twice)))
'''
[[0 0]
 [1 2]]
'''
print(np.column_stack((a,b)))
'''
[[ 0  1  2  0  2  4]
 [ 3  4  5  6  8 10]
 [ 6  7  8 12 14 16]]
'''
#row_stack对于一维数组行组合直接叠加,二维数组和vstack效果相同。
print(np.row_stack((oned,twice)))
'''
[[0 1]
 [0 2]]
'''
#数组的分割hsplit,vsplit,dsplit,split
print(a)
'''
[[0 1 2]
 [3 4 5]
 [6 7 8]]
'''
print(np.hsplit(a,3))
print(np.split(a,3,axis=1))
'''
[array([[0],
       [3],
       [6]]),
array([[1],
       [4],
       [7]]),
array([[2],
       [5],
       [8]])]
'''
#垂直分割
print(np.vsplit(a,3))
print(np.split(a,3,axis=0))
'''
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
'''
#深度分割dsplit函数将深度方向分割数组。
c = np.arange(27).reshape(3,3,3)
print(c)
'''
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]

 [[18 19 20]
  [21 22 23]
  [24 25 26]]]
'''
print(np.dsplit(c,3))
'''
[array([[[ 0],
        [ 3],
        [ 6]],

       [[ 9],
        [12],
        [15]],

       [[18],
        [21],
        [24]]]), array([[[ 1],
        [ 4],
        [ 7]],

       [[10],
        [13],
        [16]],

       [[19],
        [22],
        [25]]]), array([[[ 2],
        [ 5],
        [ 8]],

       [[11],
        [14],
        [17]],

       [[20],
        [23],
        [26]]])]
'''
#数组的属性
#ndim数组的维数,或数组的轴的个数
print(b.ndim)#2
#size 元素的总个数
print(b.size)#9
#元素在内存中所占的字节数
print(b.itemsize)#8
#数组占的存储空间
print(b.nbytes)#72
#T属性的效果和transpose函数一样
#real 输出复数数组的实部
#imag 输出数组的虚部
#flat返回一个numpy.flatiter对象
#数组的转换tolist()
print(b.tolist())#[[0, 2, 4], [6, 8, 10], [12, 14, 16]]
#astype转换数组时指定数据类型
print(b.astype(int))
'''
[[ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
'''

<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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值