1:Numpy概述安装创建数组获取shape形状
约 5042 字大约 17 分钟
1:Numpy概述安装创建数组获取shape形状
NumPy科学计算库课程文档
一、NumPy简介
- NumPy的重要性
- NumPy是Python中用于科学计算的核心库
- 在AI和数据分析领域不可或缺
- 提供了高效的多维数组(ndarray)对象和数学运算功能
- NumPy全称与简称
- 全称:Numerical Python
- 简称:NumPy (N-U-M-P-Y)
- 核心功能
- 提供多维数组(ndarray)类型
- 支持向量和矩阵运算
- 包含大量数学函数(统计、随机数生成等)
- 比原生Python列表计算效率更高
二、NumPy与其他库的关系
- 与Python基础的关系
- Python基础语法是必要的
- NumPy建立在Python基础上,提供更高效的数值计算
- 与深度学习框架的关系
- 兼容TensorFlow和PyTorch等框架
- 数据可以先用NumPy处理再传入这些框架
- 这些框架也支持直接读取NumPy数组
三、NumPy环境搭建
安装方式
- 如果使用Anaconda,通常已预装NumPy
- 手动安装命令:
pip install numpy
- 指定版本安装:
pip install numpy==1.14.5
验证安装
python
python
复制
import numpy as np # 导入并设置别名 print(np.__version__) # 查看版本号
四、NumPy数组创建
使用arange函数
python
python
复制
arr = np.arange(10) # 创建0-9的一维数组 print(type(arr)) # <class 'numpy.ndarray'>
使用array函数
将Python列表转换为ndarray
创建一维数组:
np.array([1, 2, 3])
创建二维数组:
np.array([[1, 2, 3], [4, 5, 6]])
五、数组属性
shape属性
返回表示数组维度的元组
一维数组示例:
arr = np.arange(10) print(arr.shape) # (10,)
获取特定维度大小:
print(arr.shape[0]) # 10
六、课程总结
- 本节重点
- 理解了NumPy在AI和数据科学中的重要性
- 掌握了NumPy数组的创建方法(arange和array)
- 学会了使用shape属性查看数组维度
- 后续内容预告
- 数组维度操作(改变、拼接、分割)
- 常用NumPy函数(数据存取、统计计算等)
- 数组的数学运算和广播机制
注:文档中已修正原录音转文字中的错别字,如"南派"修正为"NumPy","ending a ray"修正为"ndarray"等。
2:Numpy_array_arange
NumPy数组创建方法详解
1. 使用np.array()
创建数组
基本语法
np.array(object, dtype=None, order=None, ndmin=0)
object
: 必需参数,可以是列表、元组等可迭代对象dtype
: 可选参数,指定数组元素的数据类型order
: 可选参数,指定数组的存储顺序ndmin
: 可选参数,指定生成数组的最小维度
示例代码
创建一维数组
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr) # 输出: [1 2 3 4 5]
print(arr.shape) # 输出: (5,)
创建二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_2d)
"""
输出:
[[1 2 3]
[4 5 6]
[7 8 9]]
"""
print(arr_2d.shape) # 输出: (3, 3)
指定最小维度
arr_3d = np.array([1, 2, 3, 4, 5], ndmin=3)
print(arr_3d) # 输出: [[[1 2 3 4 5]]]
print(arr_3d.shape) # 输出: (1, 1, 5)
指定数据类型
arr_float = np.array([1, 2, 3, 4, 5], dtype=float)
print(arr_float) # 输出: [1. 2. 3. 4. 5.]
arr_complex = np.array([1, 2, 3, 4, 5], dtype=complex)
print(arr_complex) # 输出: [1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j]
2. 使用np.arange()
创建数组
基本语法
np.arange([start,] stop, [step,] dtype=None)
start
: 可选,起始值,默认为0stop
: 必需,终止值(不包含)step
: 可选,步长,默认为1dtype
: 可选,输出数组的数据类型
示例代码
基本用法
arr = np.arange(10)
print(arr) # 输出: [0 1 2 3 4 5 6 7 8 9]
指定起始和结束
arr = np.arange(1, 10)
print(arr) # 输出: [1 2 3 4 5 6 7 8 9]
指定步长
arr = np.arange(1, 10, 2)
print(arr) # 输出: [1 3 5 7 9]
指定数据类型
arr = np.arange(1, 10, 2, dtype=float)
print(arr) # 输出: [1. 3. 5. 7. 9.]
浮点数范围
arr = np.arange(10.0)
print(arr) # 输出: [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
3. NumPy数组的优势
与Python原生列表相比,NumPy数组具有以下优势:
- 提供了丰富的属性和方法(如
.shape
) - 支持高效的向量化操作
- 内存效率更高
- 有大量专门用于数值计算的函数
示例比较
my_list = [1, 2, 3, 4, 5]
# my_list.shape # 报错,列表没有shape属性
arr = np.array(my_list)
print(arr.shape) # 正确输出: (5,)
4. 组合使用创建多维数组
# 使用arange创建三个一维数组,然后组合成二维数组
b = np.array([np.arange(3), np.arange(3), np.arange(3)])
print(b)
"""
输出:
[[0 1 2]
[0 1 2]
[0 1 2]]
"""
print(b.shape) # 输出: (3, 3)
5. 学习建议
- NumPy是Python数据科学生态的基础,掌握好NumPy有助于学习其他库如TensorFlow和PyTorch
- 许多深度学习框架中的数据处理API与NumPy有相似之处
- 理解数组的维度(ndim)和形状(shape)非常重要
- 熟练使用
dtype
参数可以更好地控制数据类型
3:Numpy_random随机数生成
NumPy随机数模块详解
1. random模块概述
NumPy中的random模块包含多种生成随机数的方法,在数据科学和机器学习中使用频率很高。该模块可以生成各种分布的随机数,并控制随机数的形状和范围。
2. 基本随机数生成
2.1 random()方法
- 生成[0.0, 1.0)范围内的随机浮点数(左闭右开区间)
- 通过size参数控制输出数组的形状
import numpy as np
# 生成10个随机数的一维数组
arr = np.random.random(size=10)
print(arr) # 例如 [0.12, 0.45, 0.78, ...]
print(arr.shape) # (10,)
# 生成3行4列的二维数组
arr2d = np.random.random(size=(3,4))
print(arr2d) # 3x4的二维数组
2.2 randint()方法
- 生成指定范围内的随机整数
- 语法:
randint(low, high=None, size=None)
- 区间同样是左闭右开[low, high)
# 生成0-9之间的10个随机整数
arr_int = np.random.randint(10, size=10)
print(arr_int)
# 生成5-9之间的3x4数组
arr_int2d = np.random.randint(5, 10, size=(3,4))
print(arr_int2d)
3. 概率分布随机数
3.1 randn()方法
- 生成标准正态分布(μ=0, σ=1)的随机数
- 可以生成多维数组
# 生成单个标准正态随机数
x = np.random.randn()
print(x)
# 生成2行3列的数组
arr_normal = np.random.randn(2,3)
print(arr_normal)
# 生成2个3x4的三维数组
arr_normal3d = np.random.randn(2,3,4)
print(arr_normal3d)
3.2 normal()方法
生成指定参数的正态分布随机数
语法:
normal(loc=0.0, scale=1.0, size=None)
- loc: 均值(期望)
- scale: 标准差
- size: 输出形状
# 生成均值为3,标准差为1的随机数
x = np.random.normal(loc=3, scale=1)
print(x)
# 生成均值为10,标准差为2的5个随机数
arr_norm = np.random.normal(loc=10, scale=2, size=5)
print(arr_norm)
4. 随机种子(seed)
- 设置随机种子可以固定随机数生成的序列
- 在需要可重复实验时非常有用
# 设置随机种子为42
np.random.seed(42)
# 现在生成的随机数序列将固定
x1 = np.random.randn()
x2 = np.random.randn()
print(x1, x2) # 每次运行结果相同
5. 随机打乱(shuffle)
- 原地打乱数组顺序
- 常用于机器学习中打乱数据集
arr = np.array([1,2,3,4,5])
np.random.shuffle(arr)
print(arr) # 例如 [2,5,1,4,3]
# 注意:shuffle是原地操作,不返回新数组
6. 总结
NumPy的random模块提供了丰富的随机数生成功能:
- 基本随机数:
random()
,randint()
- 概率分布:
randn()
,normal()
- 随机控制:
seed()
,shuffle()
- 可以生成任意形状的随机数组
这些功能在数据预处理、模拟实验、机器学习等领域都有广泛应用。
4:Numpy_ndarray属性_zeros_ones_like等创建数组函数
NumPy ndarray对象详解
ndarray对象概述
ndarray是NumPy中最重要的N维数组对象,具有以下特点:
- 是同类型数据的集合(与Python原生列表不同,原生列表可以包含不同类型元素)
- 以零下标为开始进行索引
- 每个元素在内存中占用相同大小的存储空间
ndarray内部组成
ndarray对象由以下内容组成:
- 指向数据的指针
- 内存或内存映射文件中的数据块
- 数据类型(dtype) - 描述数组中固定大小值的格子
- 表示数组形状的元组(shape) - 表示各维度大小
ndarray常用属性
属性 | 描述 | 示例 |
---|---|---|
ndim | 数组的维度数量 | arr.ndim |
shape | 数组的维度形状(对于矩阵是n行m列) | arr.shape |
size | 数组元素的总个数(shape各维度的乘积) | arr.size |
dtype | 数组元素的类型 | arr.dtype |
itemsize | 每个元素的大小(以字节为单位) | arr.itemsize |
data | 包含实际数组元素的缓冲区 | arr.data |
创建ndarray的常用方法
1. 全零数组
np.zeros(shape, dtype=float, order='C')
示例:
np.zeros((3,4)) # 创建3行4列的全零数组
2. 全一数组
np.ones(shape, dtype=None, order='C')
示例:
np.ones((2,3)) # 创建2行3列的全一数组
3. 空数组(未初始化)
np.empty(shape, dtype=float, order='C')
示例:
np.empty((3,2)) # 创建3行2列的空数组(元素值为内存原有值)
4. 基于现有数组创建
np.zeros_like(a) # 创建与a形状相同的全零数组
np.ones_like(a) # 创建与a形状相同的全一数组
np.empty_like(a) # 创建与a形状相同的空数组
示例:
arr = np.array([[1,2,3],[4,5,6]])
np.zeros_like(arr) # 创建2行3列的全零数组
5. 等差数列数组
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数说明:
start
:序列起始值stop
:序列结束值num
:要生成的样本数endpoint
:是否包含stop值(默认为True)retstep
:是否返回步长(默认为False)
示例:
np.linspace(0, 10, 5) # [0, 2.5, 5, 7.5, 10]
np.linspace(0, 10, 4, endpoint=False) # [0, 2.5, 5, 7.5]
6. 等比数列数组
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
示例:
np.logspace(0, 9, 10, base=2) # 以2为底的0-9次方的等比数列
注意事项
np.empty
比np.zeros
效率更高,因为它不初始化数组元素值,适合后续会完全重写数组内容的情况order
参数('C'或'F')表示内存中存储顺序是行优先还是列优先,通常使用默认值即可- 创建数组时,shape参数需要以元组形式传入,如
(3,4)
- NumPy数组是同质的(所有元素类型相同),这与Python原生列表不同
- 实际应用中,
ndim
、shape
、size
、dtype
等属性使用频率较高
5:NumPyreshape切片操作_copy函数
NumPy数组切片、索引与reshape操作详解
一、NumPy数组基础操作
1. 切片与索引
- NumPy数组的切片和索引操作与Python原生list非常相似
- 基于0到N的下标进行索引,可以设置start、stop和step参数
- 切片操作会返回一个新的数组
示例:
import numpy as np
arr = np.arange(10) # 创建0-9的数组
print(arr[2:]) # 从索引2开始到最后
print(arr[2:7]) # 从索引2到6
print(arr[2:7:2]) # 从索引2到6,步长为2
2. reshape操作
reshape
函数用于改变数组的形状而不改变数据- 新形状的元素数量必须与原数组一致
示例:
arr = np.arange(12) # 创建0-11的数组
arr_2d = arr.reshape(3, 4) # 转换为3行4列的二维数组
print(arr_2d)
注意:
- 不能将12个元素的数组reshape为3×3(9个元素),会报错
- 可以reshape为3×4、4×3、2×6等形状
二、多维数组操作
1. 二维数组取值
arr = np.arange(12).reshape(3, 4)
# 获取第二行
print(arr[1]) # 输出:[3 4 5 6]
# 获取第二行第三个元素
print(arr[1][2]) # 输出:5
2. 同时取多行多列
# 获取第2-3行,第2-3列(4578)
print(arr[1:3, 1:3])
说明:
- 逗号前表示行范围,逗号后表示列范围
- 切片是左闭右开区间
三、copy函数的重要性
1. 直接切片赋值的问题
arr = np.arange(12).reshape(3, 4)
temp = arr[1:3, 1:3] # 获取4578
temp[1,1] = 9 # 将8改为9
print(temp) # 输出:[[4 5][7 9]]
print(arr) # 原数组也被修改了!
2. 使用copy函数
arr = np.arange(12).reshape(3, 4)
temp = np.copy(arr[1:3, 1:3]) # 使用copy
temp[1,1] = 9
print(temp) # 输出:[[4 5][7 9]]
print(arr) # 原数组保持不变
内存原理说明:
- 直接切片赋值是"视图"操作,共享内存
- copy函数会创建新的内存空间存储数据副本
四、总结
- reshape操作:可以灵活改变数组形状,但总元素数必须一致
- 切片索引:与Python列表类似,但支持多维操作
- copy函数:当需要独立修改子数组而不影响原数组时,必须使用
这些操作是NumPy数据处理的基础,熟练掌握可以提高数组操作的效率和安全性。
6:Numpy改变数组维度数组的拼接
NumPy数组维度操作与拼接教程
一、改变数组维度
1. reshape方法
- 可以将数组从低维变为高维,或从高维变为低维
- 示例:
import numpy as np
arr = np.arange(12) # 0-11的一维数组
arr_2d = arr.reshape((3, 4)) # 变为3行4列的二维数组
arr_3d = arr.reshape((2, 3, 2)) # 变为2个3行2列的三维数组
arr_1d = arr_3d.reshape(12) # 变回一维数组
2. ravel和flatten方法
- 将多维数组变为一维数组
- 两者功能相同
- 示例:
arr_2d = np.array([[1,2,3],[4,5,6]])
arr_1d_ravel = arr_2d.ravel() # [1,2,3,4,5,6]
arr_1d_flatten = arr_2d.flatten() # [1,2,3,4,5,6]
3. 直接设置shape属性
arr = np.arange(6)
arr.shape = (2, 3) # 直接改变形状
4. resize方法
arr = np.array([1,2,3,4])
arr.resize((2,2)) # 改变数组维度
二、数组拼接
1. 水平拼接hstack
- 将数组在水平方向(列方向)拼接
- 要求行数相同
- 示例:
a = np.array([[1,2,3],[4,5,6]])
b = np.array([['A','B','C'],['D','E','F']])
result = np.hstack([a, b])
"""
结果:
[[1, 2, 3, 'A', 'B', 'C'],
[4, 5, 6, 'D', 'E', 'F']]
"""
2. 垂直拼接vstack
- 将数组在垂直方向(行方向)拼接
- 要求列数相同
- 示例:
a = np.array([[1,2,3],[4,5,6]])
b = np.array([['A','B','C'],['D','E','F']])
result = np.vstack([a, b])
"""
结果:
[[1, 2, 3],
[4, 5, 6],
['A', 'B', 'C'],
['D', 'E', 'F']]
"""
3. concatenate方法
- 更灵活的拼接方法,可以指定拼接轴
- axis=0: 垂直拼接(相当于vstack)
- axis=1: 水平拼接(相当于hstack)
- 示例:
a = np.array([[1,2],[3,4]])
b = np.array([[5,6]])
# 垂直拼接
result1 = np.concatenate([a, b], axis=0)
"""
[[1, 2],
[3, 4],
[5, 6]]
"""
# 水平拼接(需要行数相同)
c = np.array([[5],[6]])
result2 = np.concatenate([a, c], axis=1)
"""
[[1, 2, 5],
[3, 4, 6]]
"""
4. 三维数组拼接
- 对于三维数组,可以沿不同轴拼接
- 示例:
aa = np.array([[[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]]) # 2个2行3列
bb = np.array([[[13,14,15],[16,17,18]], [[19,20,21],[22,23,24]]]) # 2个2行3列
# 沿axis=0拼接(第一个维度)
result0 = np.concatenate([aa, bb], axis=0) # 4个2行3列
# 沿axis=1拼接(第二个维度)
result1 = np.concatenate([aa, bb], axis=1) # 2个4行3列
# 沿axis=2拼接(第三个维度)
result2 = np.concatenate([aa, bb], axis=2) # 2个2行6列
总结
- 改变数组维度:reshape、ravel/flatten、shape属性、resize
- 数组拼接:
- 水平拼接:hstack 或 concatenate(axis=1)
- 垂直拼接:vstack 或 concatenate(axis=0)
- 三维数组可以沿不同轴拼接
- 拼接时需要注意数组在拼接方向的维度必须匹配
7:Numpy_数组的切分和转置
8:Numpy算术运算向上向下取整
NumPy算术运算与数学函数课程文档
一、NumPy算术运算基础
1. 基本算术运算
- 当两个NumPy数组(NDArray)形状相同时,可以进行对应位置的算术运算
- 支持的运算包括:加、减、乘、除
- 可以使用运算符或显式函数:
- 加法:
+
或np.add()
- 减法:
-
或np.subtract()
- 乘法:
*
或np.multiply()
- 除法:
/
或np.divide()
- 加法:
2. 示例代码
import numpy as np
# 创建两个3×3的数组
a = np.arange(9).reshape(3, 3) # 0-8的数字,形状为3×3
b = np.arange(9).reshape(3, 3) # 同上
# 加法运算
print(a + b) # 对应位置相加
print(np.add(a, b)) # 使用add函数
# 减法运算
print(a - b) # 对应位置相减
print(np.subtract(a, b)) # 使用subtract函数
二、广播机制
1. 广播规则
- 当数组形状不同时,NumPy会尝试广播较小的数组以匹配较大数组的形状
- 广播规则:从右向左比较维度,当维度相等或其中一个为1时可以进行广播
2. 示例代码
# 创建3×3数组和1×3数组
a = np.arange(9).reshape(3, 3) # 3×3数组
c = np.array([2, 3, 4]) # 1×3数组
# 广播加法
print(a + c)
# 相当于c被广播为[[2,3,4],[2,3,4],[2,3,4]],然后对应位置相加
三、数学函数
1. 基本数学函数
三角函数:
np.sin()
np.cos()
np.tan()
四舍五入:
np.around(a, decimals=0)
- 四舍五入到指定小数位
- decimals为正数:舍入到小数点右侧位数
- decimals为负数:舍入到小数点左侧位数
2. 取整函数
np.floor()
- 向下取整np.ceil()
- 向上取整
3. 示例代码
# 四舍五入示例
print(np.around(4.5)) # 输出4.0(注意NumPy的舍入规则)
print(np.around(4.6)) # 输出5.0
# 取整示例
print(np.floor(4.5)) # 输出4.0
print(np.ceil(4.1)) # 输出5.0
四、out参数的使用
1. out参数说明
- 许多NumPy函数接受
out
参数,用于指定结果存储的位置 - 可以避免创建临时数组,提高性能
2. 示例代码
x = np.arange(5) # [0,1,2,3,4]
# 方法1:直接运算
y1 = x * 10
# 方法2:使用multiply函数
y2 = np.multiply(x, 10)
# 方法3:使用out参数
y3 = np.empty(5) # 创建空数组
np.multiply(x, 10, out=y3) # 结果存入y3
print(y1, y2, y3) # 三种方法结果相同
五、实际应用场景
1. 批次数据处理
- 在机器学习中,计算数据批次数量时常用取整函数
- 示例:
- 总数据量:1005条
- 批次大小:100条
np.floor(1005/100)
→ 10个完整批次(丢弃最后5条)np.ceil(1005/100)
→ 11个批次(最后5条作为一个批次)
2. 性能优化
- 使用
out
参数可以减少内存分配,提高大规模数据处理的效率
注意事项
np.around()
的舍入规则可能与数学上的四舍五入不同,使用时需注意- 广播机制虽然方便,但要注意维度匹配,避免意外的广播行为
- 对于取整操作,优先使用
np.floor()
和np.ceil()
而非np.around()
9:Numpy_聚合函数
NumPy聚合函数教学文档
一、NumPy统计函数概述
NumPy提供了多种统计函数,用于对数组进行统计分析,包括:
- 查找最小/最大元素
- 计算百分位、标准差
- 计算方差等
二、常用聚合函数详解
1. 基本统计函数
np.sum()
- 求和
arr = np.array([1, 2, 3, 5, 5])
np.sum(arr) # 输出16
np.product()
- 乘积
np.product(arr) # 1 * 2 * 3 * 5 * 5=150
np.min()
- 最小值
np.min(arr) # 1
np.max()
- 最大值
np.max(arr) # 5
np.mean()
- 平均值
np.mean(arr) # 3.2
np.median()
- 中位数
np.median(arr) # 3.0
2. 方差与标准差
np.var()
- 方差
np.var(arr) # 2.56
np.std()
- 标准差
np.std(arr) # 1.6
3. 索引函数
np.argmin()
- 最小值索引
np.argmin(arr) # 0 (第一个元素1的索引)
np.argmax()
- 最大值索引
np.argmax(arr) # 3 (第一个5的索引)
4. 数学运算函数
np.power()
- 幂运算
np.power(arr, 2) # [1, 4, 9, 25, 25]
np.sqrt()
- 平方根
np.sqrt(arr) # [1., 1.414, 1.732, 2.236, 2.236]
np.exp()
- 指数函数
np.exp(10) # e的10次方
np.log()
- 对数函数
np.log(np.exp(10)) # 10.0
5. 特殊值
np.inf
- 无穷大
np.inf # 表示无穷大
三、函数应用说明
np.argmin()
和np.argmax()
在机器学习中会经常使用对数函数(
np.log
)的性质:
- 单调递增函数
- 可以将乘法转换为加法:log(a*b) = loga + logb
- 在优化问题中,寻找最小损失函数等价于寻找最小对数损失函数
四、数学原理补充
对于单调递增函数f(x),当x增加时f(x)也增加。因此:
- 寻找使loss(θ)最小的θ值
- 等价于寻找使log(loss(θ))最小的θ值
这一性质在机器学习的优化问题中非常重要。