Numpy 基础学习

本文介绍了Numpy的基础知识,包括基础运算、array的查找、赋值、合并与分割等核心概念,是Python进行数据分析和机器学习的重要工具。

基础运算

a = np.array([1,2,3,4]).reshape((2,2))
b = np.arange(4).reshape((2,2))

c = a-b
d = a*b
# 矩阵对应数相乘
e1 = np.dot(a, b)
e2 = a.dot(b)
# 矩阵乘法

print(a<3)
# 可以对矩阵元素进行逻辑运算 返还ture或flose

a = np.random.random((2,4))
# np中random和平常random类似  如果random.random((2,4)) 生产2行4列,0~1之间随机数
# 如果数据已经是array 有些可以直接写成  A.sum() 和np.sum(A) 一样
a_sum = np.sum(a)
a_min = np.min(a)
a_max = np.max(a)
# 还可以只求行 或者列 最大最小 求和
a_max_c = np.max(a,axis=1)
a_max_r = np.max(a,axis=0)
#  axis=1 返还每行的最大值 返还一个列表
#  axis=0 返还每列的最大值  返还一个列表

print(np.argmax(a))
# a中最大值的索引值   还有  argmix
print(np.mean(a))
# a的均值
print(np.average(a))
# average平均值
print(np.median(a))
# median 中位数
print(np.cumsum(a))
# a的累加函数 结果 [ 2  5  9 14 20 27 35 44 54 65]
print(np.diff(a))
# 累差函数 每一行中后一项与前一项之差
print(np.sort(a))
# 和sort函数类似  进行一种排列
print(np.transpose(a))
print(a.T)
# 以上两种方法都是对a进行转置
print(np.clip(a,5,10))
# clip(修剪) clip(Array,Array_min,Array_max) 对于a中小于Array_min的值将其替换成Array_min,Array_max 对于超过的替换

array 的查找

a = np.arange(3,15).reshape((3,4))
print(a,'\n')
print(a[2])
# 对于矩阵索引的第一个[]就是第几行, 如上结果是a的第二行
print(a[1][1])
print(a[1,1])
# 具体到某个位置 上面结果2行2列的数  上面两种表示方式相同
print(a[1,1:4])
# 相当于切片也可以 [1:,2] 第二行的2~5列
print("---------")
for row in a:
    print('\n',row)
# for循环会逐行进行打印 没有逐列打印的直接方式 可以对a转置在逐列如下
print("---------")
for col in a.T:
    print('\n',col)

# 如果想迭代矩阵的所有元素,需要将其转为一行,使用  a.flat(这是一个迭代器不是array,如果想看array要 a.flatten())
print("---------")
print(a.flatten())
for item in a.flat:
    print(item)

array 的赋值

# 赋值 copy
a = [1,2,3,4,5]
b = a
c = b
print(b)
print(c)
# 如果改变a的值或者b的值 所有abc 都会变化 因为如果直接 a = b 相当于a与b关联
a[1] = 10
print(a)
print(b)
# 对于只想赋值其相同值而不关联 需要 b = a.copy()
q = a.copy()
print('q', q)
a[2] = 9
print(b) # [1, 10, 9, 4, 5]
print(q) # [1, 10, 3, 4, 5]

array 合并

# 对矩阵进行合并  hstack vstack
a = np.array([1,2,3])
b = np.array([11,22,33])
print(np.vstack((a,b)))  # vertical(垂直) stack
print(np.hstack((a,b))) # horizontal(水平) stack
print("---------")
# 对于一个行向量,如果用前面的转置方法(.T或transpose) 无法进行转置,因为其不是一个array
# 注意里面是()
print(a.T)   # 仍然是[1 2 3]
# 方法 np.newaxis()
print("---------")
print(a[:,np.newaxis])
# 在要转置的向量后面直接加就可以,但是newaxis()不能作用于矩阵

# 多个array连接  可以还是使用vstack或者hstack  还可以使用concatenate((x,y)) 可以通过axis 选择合并的方向
# 下面两种效果一样
print(np.vstack((a,b,a)),"\n")
print(np.concatenate((a,b,a))) 

array 的分割

a = np.arange(12).reshape((3,4))
print(a)
print('\n',np.split(a,2,axis=1))  #如果不写axis 默认是axis=0(矩阵上下分块)

# 有时想要不等量分割  如对于下面这个矩阵想要竖着分成三份 可以  arrary_split
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]
print('\n',np.array_split(a,3,axis=1))
# 但不知道如何控制想要的结果,还需要学习

# 还可以使用vsplit(垂直分割) 和hsplit  基本上用不到,上面就够了
print(np.hsplit(a,3)) # 等于 print(np.split(a,2,axis=1))

补充

# np.where 是三元表达式向量化版本,而且where第二,三个参数不需要是数组,可以是标量
a = np.array([1,2,3,4])
b = np.array([6,7,8,9])
c = np.array([True, False, True, False])
result = np.where(c,a,b)  # [1, 7, 3, 9]
# 如果想要将一组数中的某些数替换成标量
a = np.random.randn(4,4)
a1 = np.where(a > 0, "a", 3)  # 将a中大于0的换成a小于的换成3
a2 = np.where(a < 0, 2, a) # 只讲a中小于0的替换
# a1 [['3' '3' '3' 'a']
 ['a' '3' 'a' 'a']
 ['a' '3' 'a' 'a']
 ['3' 'a' 'a' 'a']]
# a2 [[2.         2.         2.         0.25344902]
 [2.27838389 2.         1.44099603 1.32540036]
 [0.16570196 2.         1.34380092 2.20212735]
 [2.         1.15632934 2.28351864 1.68879952]]
<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]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值