numpy简要学习
本章小结
本章主要针对科学计算库 NumPy 进行了介绍,包括以下内容:
一、ndarray 数组对象
- ndarray 是 NumPy 的核心数据结构,用于存储同类型数据的多维数组
- 常用属性:shape(形状)、ndim(维度)、size(元素总数)、dtype(数据类型)、T(转置)
二、数组的创建
- np.array():从列表或元组创建数组
- np.zeros():创建全零数组
- np.ones():创建全一数组
- np.arange():创建等差数组
- np.linspace():创建等间距数组
- np.random.rand():创建随机数组
三、数组的运算
- 算术运算:加、减、乘、除都是元素级运算
- 广播机制:不同形状的数组进行运算时,NumPy 会自动扩展较小的数组
四、索引和切片操作
- 基本索引:arr[行, 列] 的形式访问元素
- 切片操作:arr[开始:结束:步长] 的形式获取子数组
- 布尔索引:使用条件表达式筛选元素,如 arr[arr > 5]
- 花式索引:使用整数数组作为索引
五、数组的转置和轴对称
- .T 属性:快速转置
- transpose() 方法:以元组形式传入轴编号进行重排
- swapaxes() 方法:交换两个轴
六、NumPy 通用函数
- 一元通用函数:abs(绝对值)、sqrt(平方根)、square(平方)、exp(指数)、log(对数)、sign(正负号)、ceil(向上取整)、floor(向下取整)、rint(四舍五入)、modf(分离整数小数)、isnan(判断缺失值)、isinf(判断无穷)、三角函数等
- 二元通用函数:add(相加)、subtract(相减)、multiply(相乘)、divide(除法)、maximum(最大值)、minimum(最小值)、mod(取余)、比较运算函数、逻辑运算函数等
七、线性代数模块
- np.linalg.inv():计算逆矩阵
- np.linalg.det():计算行列式
- np.linalg.eig():计算特征值和特征向量
- np.linalg.solve():求解线性方程组
- 矩阵乘法:使用 @ 运算符或 np.dot(),注意与元素级乘法 * 的区别
八、随机数模块
- np.random.rand():生成 [0,1) 区间的均匀分布随机数
- np.random.randn():生成标准正态分布随机数
- np.random.randint():生成指定区间的随机整数
- np.random.uniform():生成指定区间的均匀分布随机数
- np.random.normal():生成正态分布随机数
- np.random.seed():设置随机种子,保证结果可复现
九、数组数据处理相关操作
- np.where():条件逻辑转为数组运算,三元表达式的矢量化版本
- 统计运算:sum(求和)、mean(均值)、min(最小值)、max(最大值)、argmin(最小值索引)、argmax(最大值索引)、cumsum(累计和)、cumprod(累计积)、std(标准差)、var(方差)、median(中位数)
- 排序:arr.sort()(原地排序)、np.sort(arr)(返回新数组)
- 集合逻辑:unique(唯一值)、intersect1d(交集)、union1d(并集)、in1d(成员检查)、setdiff1d(差集)、setxor1d(对称差)
ndarray 中的数据类型
NumPy 的 ndarray 要求所有元素必须是相同的数据类型(与 Python 列表不同)。
一、整数类型
| 类型 | 说明 | 取值范围 |
|---|---|---|
int8 |
有符号8位整数 | -128 ~ 127 |
int16 |
有符号16位整数 | -32,768 ~ 32,767 |
int32 |
有符号32位整数 | -2^31 ~ 2^31-1 |
int64 |
有符号64位整数 | -2^63 ~ 2^63-1 |
uint8 |
无符号8位整数 | 0 ~ 255 |
uint16 |
无符号16位整数 | 0 ~ 65,535 |
uint32 |
无符号32位整数 | 0 ~ 2^32-1 |
uint64 |
无符号64位整数 | 0 ~ 2^64-1 |
二、浮点数类型
| 类型 | 说明 | 精度 |
|---|---|---|
float16 |
半精度浮点数 | 5位精度 |
float32 |
单精度浮点数 | 7-8位精度 |
float64 |
双精度浮点数(默认) | 15-16位精度 |
三、复数类型
| 类型 | 说明 |
|---|---|
complex64 |
32位实部 + 32位虚部 |
complex128 |
64位实部 + 64位虚部(默认) |
四、布尔类型
| 类型 | 说明 | 取值 |
|---|---|---|
bool |
布尔类型 | True / False |
五、字符串类型
| 类型 | 说明 |
|---|---|
str 或 U |
Unicode 字符串 |
S |
字节字符串(ASCII) |
六、日期时间类型
| 类型 | 说明 |
|---|---|
datetime64 |
日期时间 |
timedelta64 |
时间间隔 |
七、其他类型
| 类型 | 说明 |
|---|---|
object |
Python 对象(可存储任意类型,但速度慢) |
void |
空类型 |
数据类型优先级
当不同类型混合时,NumPy 会自动进行类型提升:
- int + float → float
- int + bool → int
- float + complex → complex
类型转换
使用 astype() 方法进行类型转换:
arr.astype(np.float32) # 转换为 float32
arr.astype(np.bool_) # 转换为 bool
arr.astype(str) # 转换为字符串
import numpy as np
a=np.array([1,2,3])
print(a)
import numpy as np
a=np.array([[1,2],[3,4]])
print(a)
import numpy as np
a=np.array([1,2,3,4,5],ndmin=2)
print(a)
import numpy as np
a = np.array([1, 2, 3, 4, 5], dtype=complex)
print(a)
import numpy as np
x = np.array(5, dtype="float32")
print('x 为 :', x)
print('x 对象的 data 属性: ', x.data)
print('x 对象的 size 属性: ', x.size)
print('x 对象的维数: ', x.ndim)
y = np.array(x, dtype="bool_")
print('转换为 bool 类型的 x 为: ', y)
z = np.array(y, dtype="float16")
print('True 值转换为 float16 类型为: ', z)
arr = np.arange(8)
b=arr[5]
c=arr[3:5]
print(arr,b,c)
多维数组切片笔记
一、基本概念 多维数组的切片是沿着行或列的方向选取元素,可以:
传入一个切片
传入多个切片
切片与整数索引混合使用
brr=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
brr.shape
brr[:2,:2]
data=np.arange(9)
data.reshape((3,3))
花式(数组)索引笔记
一、定义 花式索引(Fancy Indexing) 是 NumPy 的术语,指使用整数数组或列表进行索引,然后将数组或列表中的每个元素作为下标进行取值
import numpy as np
# 创建一维数组
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80])
# 使用列表作为索引
result = arr[[0, 2, 4]]
print(result) # [10 30 50]
# 使用数组作为索引
idx = np.array([1, 3, 5, 7])
result = arr[idx]
print(result) # [20 40 60 80]
import numpy as np
# 创建二维数组
arr2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]])
print("原始数组:")
print(arr2d)
# 选择第0行、第2行、第3行
result = arr2d[[0, 2, 3]]
print(result)
# [[ 1 2 3]
# [ 7 8 9]
# [10 11 12]]
result = arr2d[[0, 2, 3]]
print(result)
import numpy as np
# 创建一个 4×4 的二维数组
demo_arr = np.empty((4, 4))
for i in range(4):
demo_arr[i] = np.arange(i, i + 4)
print("原始数组:")
print(demo_arr)
# 获取索引为 [0, 2] 的行
result = demo_arr[[0, 2]]
result2=demo_arr[1:2]
result1 = demo_arr[:,[1,3]]
print("\n选择索引 0 和 2 的行:")
print(result)
print(result2)
花式索引:两个索引数组的用法
根据你的笔记,当使用两个花式索引操作二维数组时:
第1个 → 行索引
第2个 → 列索引
以二维数组索引的方式选取对应位置的元素
import numpy as np
# 创建 4×4 数组
demo_arr = np.array([[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11],
[12, 13, 14, 15]])
print("原始数组:")
print(demo_arr)
# 获取索引为 (1,1) 和 (3,2) 的元素
result = demo_arr[[1, 3], [1, 2]]
print("\n选取结果:")
print(result)
数组的转置和轴对称笔记
一、什么是转置? 转置是指将数组中的每个元素按照一定规则进行位置变换,简单来说就是行变列、列变行。
二、两种实现方式 NumPy 提供了两种实现转置的方法:
方式 语法 说明 T 属性 arr.T 简单快捷,最常用 transpose() 方法 arr.transpose() 功能更强大,可指定轴顺序
import numpy as np
print("=" * 30)
print("转置前后对比")
print("=" * 30)
print("\n原始数组 (3行4列):")
print("┌──-┬─---┬-──┬─---┐")
print("│ 0 │ 1 │ 2 │ 3 │")
print("├──-┼──-┼──-┼-──┤")
print("│ 4 │ 5 │ 6 │ 7 │")
print("├──-┼─-─┼─-─┼-──┤")
print("│ 8 │ 9 │ 10 │ 11 │")
print("└─-─┴──-┴─---┴-──┘")
print("\n↓ 沿主对角线轴对称 (转置) ↓\n")
print("转置后数组 (4行3列):")
print("┌──-┬─-─┬─-─┐")
print("│ 0 │ 4 │ 8 │")
print("├──-┼──-┼──-┤")
print("│ 1 │ 5 │ 9 │")
print("├──-┼──-┼──-┤")
print("│ 2 │ 6 │ 10 │")
print("├─-─┼──-┼─-─┤")
print("│ 3 │ 7 │ 11 │")
print("└──-┴──-┴──-┘")
import numpy as np
# 一维数组
arr_1d = np.array([1, 2, 3, 4])
print("原始:", arr_1d)
print("转置:", arr_1d.shape)
print("转置:", arr_1d.T) # 一维数组转置后不变
print("形状:", arr_1d.T.shape) # (4,)
import numpy as np
# 创建一个 3×4 的二维数组
arr = np.array([[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11]])
print("原始数组:")
print(arr)
print(f"原始数组形状: {arr.shape}")
# 使用 T 属性进行转置(轴对称)
arr_T = arr.T
print("转置后的数组 (arr.T):")
print(arr_T)
print(f"转置后形状: {arr_T.shape}")
import numpy as np
# 创建 2×3 的二维数组
arr_2d = np.array([[1, 2, 3],
[4, 5, 6]])
print("原始数组:")
print(arr_2d)
print("原始形状:", arr_2d.shape) # (2, 3)
# 方法1:使用 T 属性
result_T = arr_2d.T
print("\n转置后 (T属性):")
print(result_T)
print("转置后形状:", result_T.shape) # (3, 2)
# 方法2:使用 transpose() 方法
result_transpose = arr_2d.transpose()
print("\n转置后 (transpose方法):")
print(result_transpose)
arr.transpose((轴0的新位置, 轴1的新位置, 轴2的新位置, ...))
import numpy as np
# 创建 2×3×4 的三维数组
arr_3d = np.arange(24).reshape(2, 3, 4)
print(arr_3d)
print("原始数组形状:", arr_3d.shape) # (2, 3, 4)
# T 属性:反转轴的 顺序
arr_T = arr_3d.T
print(arr_T)
print("T属性转置形状:", arr_T.shape) # (4, 3, 2)
# transpose() 可以指定轴顺序
arr_transpose = arr_3d.transpose(1, 0, 2) # 交换前两个轴
print("transpose(1,0,2)形状:", arr_transpose.shape) # (3, 2, 4)
import numpy as np
# 1. 创建三维数组
arr = np.array([
[
[0, 1, 2, 3],
[4, 5, 6, 7]
],
[
[8, 9, 10, 11],
[12, 13, 14, 15]
]
])
print("=" * 50)
print("原始数组")
print("=" * 50)
print(f"数组形状: {arr.shape}")
print(f"维度说明: 第0轴={arr.shape[0]}个块, 第1轴={arr.shape[1]}行, 第2轴={arr.shape[2]}列")
print("数组内容:")
print(arr)
print()
# 3. 使用 transpose() 进行轴交换
arr_transpose = arr.transpose()
print("=" * 50)
print("执行 transpose() 后")
print("数组内容等于.T")
print(f"新数组形状: {arr_transpose.shape}")
print("数组内容:")
print(arr_transpose)
# 3. 使用 transpose(1, 0, 2) 进行轴交换
# 新轴0 = 原轴1, 新轴1 = 原轴0, 新轴2 = 原轴2
arr_transposed = arr.transpose(1, 0, 2)
print("=" * 50)
print("执行 transpose(1, 0, 2) 后")
print("=" * 50)
print(f"新数组形状: {arr_transposed.shape}")
print("数组内容:")
print(arr_transposed)
print()
- swapaxes() - 只交换两个轴 当只需要交换两个轴时,使用 swapaxes(a, b) 更简洁。
# 等价于 transpose(1, 0, 2)
arr_swap = arr.swapaxes(1, 0)
print("swapaxes(1,0) 结果形状:", arr_swap.shape)
print(arr_swap)
07Numpy通用函数
通用函数(ufunc)是一种针对ndarray中的数据执行元素级运算的函数,函数返回的是一个新的数组。
我们将ufunc中接收一个数组参数的函数称为一元通用函数,接受两个数组参数的则称为二元通用函数。
# ==========================================
# 常见的一元通用函数 (一元ufunc)
# ==========================================
import numpy as np
# 创建测试数组
arr = np.array([-4, -1, 0, 1, 4, 9])
arr_float = np.array([-1.7, -0.2, 0.5, 1.3, 2.8])
arr_pos = np.array([1, 2, 4, 9, 100])
print("=" * 50)
print("原始数组:", arr)
print("=" * 50)
# 1. abs, fabs - 绝对值
print("\n1. abs / fabs (绝对值)")
print(f" np.abs(arr): {np.abs(arr)}")
print(f" np.fabs(arr): {np.fabs(arr)}")
# 2. sqrt - 平方根
print("\n2. sqrt (平方根)")
print(f" np.sqrt(arr_pos): {np.sqrt(arr_pos)}")
# 注意:负数的平方根会返回 nan
print(f" 负数平方根: np.sqrt([-4]) = {np.sqrt([-4])}")
# 3. square - 平方
print("\n3. square (平方)")
print(f" np.square(arr): {np.square(arr)}")
# 4. exp - 指数 e^x
print("\n4. exp (指数 e^x)")
print(f" np.exp(arr): {np.exp(arr)}")
# 5. log 系列 - 各种对数
print("\n5. log 系列 (对数)")
print(f" np.log(arr_pos) (自然对数 ln): {np.log(arr_pos)}")
print(f" np.log10(arr_pos) (以10为底): {np.log10(arr_pos)}")
print(f" np.log2(arr_pos) (以2为底): {np.log2(arr_pos)}")
print(f" np.log1p(arr_pos) (ln(1+x)): {np.log1p(arr_pos)}")
# 6. sign - 正负号
print("\n6. sign (正负号)")
print(f" np.sign(arr): {np.sign(arr)}")
print(" 说明: 1(正数) / 0(零) / -1(负数)")
# 7. ceil - 向上取整
print("\n7. ceil (向上取整)")
print(f" np.ceil(arr_float): {np.ceil(arr_float)}")
print(" 说明: 大于或等于该值的最小整数")
# ==========================================
# 补充:floor (向下取整)
# ==========================================
print("\n8. floor (向下取整) - 补充")
print(f" np.floor(arr_float): {np.floor(arr_float)}")
print(" 说明: 小于或等于该值的最大整数")
# ==========================================
# 快速对照表(打印版)
# ==========================================
print("\n" + "=" * 50)
print("一元通用函数速查表")
print("=" * 50)
print("""
| 函数 | 描述 |
|-------------------|--------------------------------|
| abs, fabs | 计算绝对值 |
| sqrt | 计算平方根 |
| square | 计算平方 |
| exp | 计算指数 e^x |
| log | 自然对数 (底数为e) |
| log10 | 以10为底的对数 |
| log2 | 以2为底的对数 |
| log1p | 计算 log(1+x) |
| sign | 正负号: 1(正), 0(零), -1(负) |
| ceil | 向上取整 (大于等于的最小整数) |
| floor | 向下取整 (小于等于的最大整数) |
""")
# ==========================================
# 常见的一元通用函数 (一元ufunc) - 第二组
# ==========================================
import numpy as np
# 创建测试数组
arr = np.array([-1.7, -0.2, 0.5, 1.3, 2.8])
arr_with_nan = np.array([1, 2, np.nan, 4, np.nan, 6])
arr_with_inf = np.array([1, 2, np.inf, 4, -np.inf, 6])
angles = np.array([0, np.pi/6, np.pi/4, np.pi/3, np.pi/2])
print("=" * 50)
print("原始数组:", arr)
print("=" * 50)
# 1. floor - 向下取整
print("\n1. floor (向下取整)")
print(f" np.floor(arr): {np.floor(arr)}")
print(" 说明: 小于或等于该值的最大整数")
# 2. rint - 四舍五入到最接近的整数
print("\n2. rint (四舍五入)")
print(f" np.rint(arr): {np.rint(arr)}")
print(" 说明: 四舍五入到最接近的整数(0.5会取到最近的偶数)")
# 3. modf - 分离小数和整数部分
print("\n3. modf (分离小数和整数)")
fractional, integer = np.modf(arr)
print(f" 小数部分: {fractional}")
print(f" 整数部分: {integer}")
print(" 说明: 返回两个数组,分别为小数部分和整数部分")
# 4. isnan - 判断是否为 NaN
print("\n4. isnan (判断是否为NaN)")
print(f" 原始数组: {arr_with_nan}")
print(f" np.isnan(arr_with_nan): {np.isnan(arr_with_nan)}")
print(" 说明: 返回布尔型数组,True表示该位置是NaN")
# 5. isfinite - 判断是否为有穷数
print("\n5. isfinite (判断是否有穷)")
print(f" 原始数组: {arr_with_inf}")
print(f" np.isfinite(arr_with_inf): {np.isfinite(arr_with_inf)}")
print(" 说明: 返回布尔型数组,True表示该位置是有穷数(不是inf或NaN)")
# 6. isinf - 判断是否为无穷
print("\n6. isinf (判断是否为无穷)")
print(f" 原始数组: {arr_with_inf}")
print(f" np.isinf(arr_with_inf): {np.isinf(arr_with_inf)}")
print(" 说明: 返回布尔型数组,True表示该位置是正无穷或负无穷")
# 7. sin, cos, tan - 三角函数
print("\n7. 三角函数")
print(f" 角度(弧度): {angles}")
print(f" np.sin(angles): {np.sin(angles)}")
print(f" np.cos(angles): {np.cos(angles)}")
print(f" np.tan(angles): {np.tan(angles)}")
# 8. sinh, cosh, tanh - 双曲函数
print("\n8. 双曲函数")
x = np.array([-1, 0, 1])
print(f" x: {x}")
print(f" np.sinh(x): {np.sinh(x)}")
print(f" np.cosh(x): {np.cosh(x)}")
print(f" np.tanh(x): {np.tanh(x)}")
# 9. arcsin, arccos, arctan - 反三角函数
print("\n9. 反三角函数")
values = np.array([-1, -0.5, 0, 0.5, 1])
print(f" values: {values}")
print(f" np.arcsin(values): {np.arcsin(values)}")
print(f" np.arccos(values): {np.arccos(values)}")
print(f" np.arctan(values): {np.arctan(values)}")
# ==========================================
# 快速对照表(打印版)
# ==========================================
print("\n" + "=" * 50)
print("一元通用函数速查表(第二组)")
print("=" * 50)
print("""
| 函数 | 描述 |
|-------------------------|----------------------------------------|
| floor | 向下取整(小于等于该值的最大整数) |
| rint | 四舍五入到最接近的整数 |
| modf | 分离小数和整数部分(返回两个数组) |
| isnan | 判断是否为NaN(返回布尔数组) |
| isfinite | 判断是否为有穷数(不是inf/NaN) |
| isinf | 判断是否为无穷(正无穷或负无穷) |
| sin, cos, tan | 三角函数(输入为弧度) |
| sinh, cosh, tanh | 双曲三角函数 |
| arcsin, arccos, arctan | 反三角函数 |
""")
# ==========================================
# 综合示例
# ==========================================
print("\n" + "=" * 50)
print("综合示例")
print("=" * 50)
data = np.array([-2.7, -1.5, 0, 1.5, 2.7, np.nan, np.inf])
print(f"原始数据: {data}")
print(f"floor: {np.floor(data)}")
print(f"rint: {np.rint(data)}")
print(f"isnan: {np.isnan(data)}")
print(f"isfinite: {np.isfinite(data)}")
print(f"isinf: {np.isinf(data)}")
# modf 单独演示
clean_data = np.array([-2.7, -1.5, 0, 1.5, 2.7])
frac, int_part = np.modf(clean_data)
print(f"\nmodf 演示 (clean_data: {clean_data})")
print(f" 小数部分: {frac}")
print(f" 整数部分: {int_part}")
# ==========================================
# 常见的二元通用函数 (二元ufunc)
# ==========================================
import numpy as np
# 创建测试数组
a = np.array([1, 2, 3, 4, 5])
b = np.array([2, 3, 4, 5, 6])
c = np.array([-2, -1, 0, 1, 2])
print("=" * 50)
print("原始数组")
print("=" * 50)
print(f"a = {a}")
print(f"b = {b}")
print(f"c = {c}")
# 1. add - 相加
print("\n1. add (相加)")
print(f" np.add(a, b): {np.add(a, b)}")
print(f" 等价于 a + b: {a + b}")
# 2. subtract - 相减
print("\n2. subtract (相减)")
print(f" np.subtract(a, b): {np.subtract(a, b)}")
print(f" 等价于 a - b: {a - b}")
# 3. multiply - 相乘
print("\n3. multiply (相乘)")
print(f" np.multiply(a, b): {np.multiply(a, b)}")
print(f" 等价于 a * b: {a * b}")
# 4. divide / floor_divide - 除法 / 向下取整除法
print("\n4. divide / floor_divide (除法)")
print(f" np.divide(a, b): {np.divide(a, b)}")
print(f" np.floor_divide(a, b): {np.floor_divide(a, b)} (向下取整除法)")
print(f" 等价于 a // b: {a // b}")
# 5. maximum / fmax - 最大值
print("\n5. maximum / fmax (最大值)")
print(f" np.maximum(a, b): {np.maximum(a, b)}")
print(f" np.maximum(a, c): {np.maximum(a, c)}")
print(" 说明: fmax 会忽略NaN,maximum 不会")
# 6. minimum / fmin - 最小值
print("\n6. minimum / fmin (最小值)")
print(f" np.minimum(a, b): {np.minimum(a, b)}")
print(f" np.minimum(a, c): {np.minimum(a, c)}")
# 7. mod - 求模(取余数)
print("\n7. mod (求模/取余数)")
print(f" np.mod(b, a): {np.mod(b, a)}")
print(f" 等价于 b % a: {b % a}")
# 8. copysign - 复制符号
print("\n8. copysign (复制符号)")
print(f" np.copysign(a, c): {np.copysign(a, c)}")
print(" 说明: 将第二个数组的符号赋给第一个数组的值")
# 9. 比较运算函数
print("\n9. 比较运算函数 (返回布尔数组)")
print(f" a = {a}, b = {b}")
print(f" np.greater(a, b) (a > b): {np.greater(a, b)}")
print(f" np.greater_equal(a, b) (a >= b): {np.greater_equal(a, b)}")
print(f" np.less(a, b) (a < b): {np.less(a, b)}")
print(f" np.less_equal(a, b) (a <= b): {np.less_equal(a, b)}")
print(f" np.equal(a, b) (a == b): {np.equal(a,b)}")
print(f" np.not_equal(a, b) (a != b): {np.not_equal(a,b)}")
# 10. 逻辑运算函数
print("\n10. 逻辑运算函数")
x = np.array([True, True, False, False])
y = np.array([True, False, True, False])
print(f" x = {x}")
print(f" y = {y}")
print(f" np.logical_and(x, y): {np.logical_and(x,y)} (与运算)")
print(f" np.logical_or(x, y): {np.logical_or(x,y)} (或运算)")
print(f" np.logical_xor(x, y): {np.logical_xor(x,y)} (异或运算)")
# ==========================================
# 快速对照表(打印版)
# ==========================================
print("\n" + "=" * 50)
print("二元通用函数速查表")
print("=" * 50)
print("""
| 函数 | 描述 |
|-----------------------------------|--------------------------------|
| add | 将数组中对应的元素相加 |
| subtract | 从第一个数组中减去第二个数组 |
| multiply | 数组元素相乘 |
| divide | 除法 |
| floor_divide | 向下整除法(舍去余数) |
| maximum, fmax | 元素级的最大值计算 |
| minimum, fmin | 元素级的最小值计算 |
| mod | 元素级的求模计算(取余数) |
| copysign | 将第二个数组的符号赋给第一个数组 |
| greater, greater_equal | 执行 >, >= 比较运算 |
| less, less_equal | 执行 <, <= 比较运算 |
| equal, not_equal | 执行 ==, != 比较运算 |
| logical_and, logical_or, logical_xor | 逻辑与、或、异或运算 |
""")
# ==========================================
# 综合示例
# ==========================================
print("\n" + "=" * 50)
print("综合示例")
print("=" * 50)
arr1 = np.array([10, 20, 30, 40, 50])
arr2 = np.array([3, 5, 7, 9, 11])
print(f"arr1 = {arr1}")
print(f"arr2 = {arr2}")
print()
print(f"相加: {np.add(arr1,arr2)}")
print(f"相减: {np.subtract(arr1,arr2)}")
print(f"相乘: {np.multiply(arr1,arr2)}")
print(f"除法: {np.divide(arr1,arr2)}")
print(f"整除: {np.floor_divide(arr1,arr2)}")
print(f"最大值: {np.maximum(arr1,arr2)}")
print(f"最小值: {np.minimum(arr1,arr2)}")
print(f"取余数: {np.mod(arr1,arr2)}")
print(f"arr1 > arr2: {np.greater(arr1,arr2)}")
import numpy as np
# 包含 NaN 的数组
a = np.array([1, 2, np.nan, 4, 5])
b = np.array([10, 20, 30, 40, np.nan])
print("=" * 50)
print("maximum vs fmax 对比")
print("=" * 50)
print(f"a = {a}")
print(f"b = {b}")
print()
print("np.maximum(a, b):")
print(f" {np.maximum(a, b)}")
print(" 说明: 只要有一个是 NaN,结果就是 NaN")
print()
print("np.fmax(a, b):")
print(f" {np.fmax(a, b)}")
print(" 说明: 忽略 NaN,返回另一个非 NaN 的值")
08利用numpy数组进行数据处理
np.where() - 将条件逻辑转为数组运算
np.where() 是三元表达式 x if condition else y 的矢量化版本。
语法
```python np.where(condition, x, y) condition:条件数组(布尔型)
x:条件为 True 时取值的数组或标量
y:条件为 False 时取值的数组或标量
import numpy as np
# 示例1:基本用法
arr_x = np.array([1, 5, 7])
arr_y = np.array([2, 6, 8])
arr_con = np.array([True, False, True])
result = np.where(arr_con, arr_x, arr_y)
print(result) # [1 6 7]
print("""
索引0:True → 取 arr_x[0] = 1
索引1:False → 取 arr_y[1] = 6
索引2:True → 取 arr_x[2] = 7""")
re2=np.where(arr_x>3,1,0)
print(re2)
数组统计运算
通过 NumPy 库中的相关方法,可以很方便地进行数组的统计汇总。
常用统计方法速查表
| 方法 | 描述 |
|---|---|
sum |
对数组中全部或某个轴向上的元素求和 |
mean |
算术平均值 |
min |
计算数组中的最小值 |
max |
计算数组中的最大值 |
argmin |
返回最小值的索引 |
argmax |
返回最大值的索引 |
cumsum |
所有元素的累计和 |
cumprod |
所有元素的累计积 |
重要参数:axis
大多数统计方法都支持 axis 参数:
axis=0:沿着行方向(垂直),对各列进行统计axis=1:沿着列方向(水平),对各⾏进行统计- 不指定 axis:对所有元素进行统计
## 代码单元格(可直接运行)
# ==========================================
# 数组统计运算
# ==========================================
import numpy as np
# 创建测试数组
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print("=" * 50)
print("原始数组")
print("=" * 50)
print(arr)
print(f"形状: {arr.shape}")
# 1. sum - 求和
print("\n1. sum (求和)")
print(f" 全部元素求和: {np.sum(arr)}")
print(f" 按列求和 (axis=0): {np.sum(arr, axis=0)}")
print(f" 按行求和 (axis=1): {np.sum(arr, axis=1)}")
# 2. mean - 平均值
print("\n2. mean (平均值)")
print(f" 全部元素平均值: {np.mean(arr)}")
print(f" 按列求平均 (axis=0): {np.mean(arr, axis=0)}")
print(f" 按行求平均 (axis=1): {np.mean(arr, axis=1)}")
# 3. min / max - 最小值和最大值
print("\n3. min / max (最小/最大值)")
print(f" 全局最小值: {np.min(arr)}")
print(f" 全局最大值: {np.max(arr)}")
print(f" 每列最小值: {np.min(arr, axis=0)}")
print(f" 每行最大值: {np.max(arr, axis=1)}")
# 4. argmin / argmax - 最值索引
print("\n4. argmin / argmax (最值索引)")
print(f" 全局最小值索引 (扁平化后): {np.argmin(arr)}")
print(f" 全局最大值索引 (扁平化后): {np.argmax(arr)}")
print(f" 每列最小值索引: {np.argmin(arr, axis=0)}")
print(f" 每行最大值索引: {np.argmax(arr, axis=1)}")
# 5. cumsum - 累计和
print("\n5. cumsum (累计和)")
print(f" 全部元素累计和: {np.cumsum(arr)}")
print(f" 按列累计和 (axis=0):\n{np.cumsum(arr, axis=0)}")
print(f" 按行累计和 (axis=1):\n{np.cumsum(arr, axis=1)}")
# 6. cumprod - 累计积
print("\n6. cumprod (累计积)")
print(f" 全部元素累计积: {np.cumprod(arr)}")
print(f" 按列累计积 (axis=0):\n{np.cumprod(arr, axis=0)}")
print(f" 按行累计积 (axis=1):\n{np.cumprod(arr, axis=1)}")
# 7. 补充:标准差、方差、中位数
print("\n" + "=" * 50)
print("补充统计方法")
print("=" * 50)
arr_flat = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
print(f"数组: {arr_flat}")
print(f"标准差: {np.std(arr_flat):.2f}")
print(f"方差: {np.var(arr_flat):.2f}")
print(f"中位数: {np.median(arr_flat)}")
print(f"第50百分位数: {np.percentile(arr_flat,50)}")
# 8. 综合示例
print("\n" + "=" * 50)
print("综合示例")
print("=" * 50)
data = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
print(f"数据:\n{data}")
print(f"\n统计摘要:")
print(f" 总和: {np.sum(data)}")
print(f" 均值: {np.mean(data)}")
print(f" 最小值: {np.min(data)} (索引: {np.argmin(data)})")
print(f" 最大值: {np.max(data)} (索引: {np.argmax(data)})")
print(f" 累计和: {np.cumsum(data)}")
print(f" 累计积: {np.cumprod(data)}")
对numpy进行排序 :sort() 方法总结 默认根据-1轴进行排序
方法 是否修改原数组 返回值 arr.sort() ✅ 是(原地排序) None np.sort(arr) ❌ 否 返回排序后的新数组
# ==========================================
# 数组排序 - sort()
# ==========================================
import numpy as np
print("=" * 50)
print("数组排序示例")
print("=" * 50)
# 创建数组
arr = np.array([[6, 2, 7], [3, 6, 2], [4, 3, 2]])
print("原数组:")
print(arr)
print()
# 原地排序(直接修改原数组)
arr.sort()
print("调用 arr.sort() 后:")
print(arr)
print()
print("说明: sort() 会直接修改原数组(原地排序)")
print(" 每行独立排序,不跨行排序")
# ==========================================
# sort() 方法总结 - 对比示例
# ==========================================
import numpy as np
print("=" * 50)
print("arr.sort() vs np.sort(arr) 对比")
print("=" * 50)
# 创建相同的测试数组
arr1 = np.array([[6, 2, 7], [3, 6, 2], [4, 3, 2]])
arr2 = np.array([[6, 2, 7], [3, 6, 2], [4, 3, 2]])
print("原始数组(两份相同数据):")
print(arr1)
print()
# ==========================================
# 方法1:arr.sort() - 原地排序
# ==========================================
print("1. arr.sort() - 原地排序")
print("-" * 30)
print(f"排序前 arr1: \n{arr1}")
print(f"arr1 的内存地址: {id(arr1)}")
arr1.sort() # 直接修改原数组
print(f"\n排序后 arr1: \n{arr1}")
print(f"arr1 的内存地址: {id(arr1)} (地址相同,说明是同一个对象)")
print("✅ 原数组被直接修改,不返回新数组")
# ==========================================
# 方法2:np.sort(arr) - 返回新数组
# ==========================================
print("\n" + "=" * 50)
print("2. np.sort(arr) - 返回新数组")
print("-" * 30)
print(f"排序前 arr2: \n{arr2}")
print(f"arr2 的内存地址: {id(arr2)}")
arr2_sorted = np.sort(arr2) # 返回新数组,原数组不变
print(f"\n排序后 arr2 (原数组): \n{arr2}")
print(f"arr2 的内存地址: {id(arr2)} (地址不变,原数组未修改)")
print(f"\n排序后返回的新数组 arr2_sorted: \n{arr2_sorted}")
print(f"arr2_sorted 的内存地址: {id(arr2_sorted)} (新地址,是新对象)")
print("✅ 原数组保持不变,返回排序后的新数组")
# ==========================================
# 实际应用示例
# ==========================================
print("\n" + "=" * 50)
print("实际应用场景")
print("=" * 50)
# 场景1:不需要保留原数据时,用 arr.sort()(节省内存)
data = np.array([5, 2, 8, 1, 9])
print("场景1 - 不需要保留原数据:")
print(f" 排序前: {data}")
data.sort()
print(f" 排序后: {data} (原数据被覆盖)")
print()
# 场景2:需要保留原数据时,用 np.sort()
original = np.array([5, 2, 8, 1, 9])
sorted_data = np.sort(original)
print("场景2 - 需要保留原数据:")
print(f" 原数组: {original}")
print(f" 排序后新数组: {sorted_data}")
print(f" 原数组保持不变: {original}")
# ==========================================
# 一维数组示例
# ==========================================
print("\n" + "=" * 50)
print("一维数组示例")
print("=" * 50)
arr_1d = np.array([3, 1, 4, 1, 5, 9, 2])
# 原地排序
arr_1d_copy = arr_1d.copy()
arr_1d_copy.sort()
print(f"arr.sort(): {arr_1d_copy}")
# 返回新数组
arr_1d_original = np.array([3, 1, 4, 1, 5, 9, 2])
result = np.sort(arr_1d_original)
print(f"np.sort(): {result}")
print(f"原数组未变: {arr_1d_original}")
import numpy as np
arr = np.array([[6, 3, 4], [7, 5, 2]])
print("原数组:")
print(arr)
print()
arr.sort(axis=-2)
print("arr.sort(axis=-2) 后:")
print(arr)
print("""
原理解释
axis=-2 在二维数组中的含义
对于二维数组:
axis=-1 表示最后一个轴(水平方向/行内axis=1)→ 按行排序
axis=-2 表示倒数第二个轴(垂直方向/列间axis=0)→ 按列排序""")
检索数组元素 - all() 和 any()
all() 和 any() 是 NumPy 中用于条件检索的两个重要函数。
函数说明
| 函数 | 作用 | 返回值 |
|---|---|---|
all() |
判断所有元素是否都满足条件 | True / False |
any() |
判断是否存在元素满足条件 | True / False |
速查表 条件 all() any() 所有 > 0 np.all(arr > 0) - 存在 > 0 - np.any(arr > 0) 所有 == 0 np.all(arr == 0) - 存在 == 0 - np.any(arr == 0) 所有都是 NaN np.all(np.isnan(arr)) - 存在 NaN - np.any(np.isnan(arr))
## 代码单元格(可直接运行)
# ==========================================
# 检索数组元素 - all() 和 any()
# ==========================================
import numpy as np
# 创建测试数组
arr = np.array([[1, -2, -7],
[-3, 6, 2],
[-4, 3, 2]])
print("=" * 50)
print("原始数组")
print("=" * 50)
print(arr)
# 1. all() - 所有元素都满足条件
print("\n1. all() - 所有元素都满足条件")
print("-" * 30)
print(f"np.all(arr > 0): {np.all(arr > 0)}")
print(f"np.all(arr > -10): {np.all(arr > -10)}")
# 2. any() - 存在元素满足条件
print("\n2. any() - 存在元素满足条件")
print("-" * 30)
print(f"np.any(arr > 0): {np.any(arr > 0)}")
print(f"np.any(arr > 10): {np.any(arr > 10)}")
# 3. 指定轴方向
print("\n3. 指定轴方向 (axis 参数)")
print("-" * 30)
print(f"axis=0 (按列) - all: {np.all(arr > 0, axis=0)}")
print(f"axis=0 (按列) - any: {np.any(arr > 0, axis=0)}")
print(f"axis=1 (按行) - all: {np.all(arr > 0, axis=1)}")
print(f"axis=1 (按行) - any: {np.any(arr > 0, axis=1)}")
# 4. 实际应用场景
print("\n4. 实际应用场景")
print("-" * 30)
# 场景1:检查数据是否全为正数
data = np.array([1, 2, 3, 4, 5])
print(f"数据全为正数? {np.all(data > 0)}")
# 场景2:检查数据是否存在缺失值
data_with_nan = np.array([1, 2, np.nan, 4, 5])
data_with_nan2=np.array([1,2,np.nan,4,5])
a=np.isnan(data_with_nan2)
print(a)
print(f"数据存在 NaN? {np.any(np.isnan(data_with_nan))}")
# 场景3:检查数组是否全为零
zeros = np.zeros((3, 3))
print(f"数组全为零? {np.all(zeros == 0)}")
# 场景4:检查数组是否有任何非零元素
non_zeros = np.array([[0, 0, 0], [0, 1, 0]])
print(f"数组有任何非零元素? {np.any(non_zeros != 0)}")
print("\n" + "=" * 50)
print("总结")
print("=" * 50)
print("""
- all(): 所有元素都满足条件 → True(类似"与"运算)
- any(): 至少一个元素满足条件 → True(类似"或"运算)
- axis参数: 指定统计方向
- axis=0: 沿着行方向(按列)
- axis=1: 沿着列方向(按行)
""")
唯一化及其他集合逻辑
针对一维数组,NumPy 提供了 unique() 函数来找出数组中的唯一值,并返回排序后的结果。
1. unique() - 唯一值
import numpy as np
arr = np.array([12, 11, 34, 23, 12, 8, 11]) result = np.unique(arr) print(result) # [ 8 11 12 23 34]
unique() 函数参数说明
| 参数 | 说明 | 返回值 |
|---|---|---|
return_index |
返回唯一值在原数组中首次出现的索引 | (unique, indices) |
return_inverse |
返回原数组在唯一值数组中的索引(用于重构) | (unique, inverse) |
return_counts |
返回唯一值出现的次数 | (unique, counts) |
- 其他集合逻辑函数
| 函数 | 说明 | 示例 |
|---|---|---|
intersect1d() |
计算两个数组的交集 | np.intersect1d(arr1, arr2) |
union1d() |
计算两个数组的并集 | np.union1d(arr1, arr2) |
setdiff1d() |
计算差集(在 arr1 中但不在 arr2 中) | np.setdiff1d(arr1, arr2) |
setxor1d() |
计算对称差(并集减交集) | np.setxor1d(arr1, arr2) |
in1d() |
检查 arr1 的元素是否在 arr2 中 | np.in1d(arr1, arr2) |
- 速查表 a = [1, 2, 3] b = [2, 3, 4]
| 操作 | 函数 | 结果示例 |
|---|---|---|
| 唯一值 | np.unique(arr) |
[1, 2, 3] |
| 唯一值 + 索引 | np.unique(arr, return_index=True) |
(values, indices) |
| 唯一值 + 次数 | np.unique(arr, return_counts=True) |
(values, counts) |
| 交集 | np.intersect1d(a, b) |
[2, 3] |
| 并集 | np.union1d(a, b) |
[1, 2, 3, 4] |
| 差集 | np.setdiff1d(a, b) |
[1] |
| 对称差 | np.setxor1d(a, b) |
[1, 4] |
| 成员检查 | np.in1d(a, b) |
[False, True, True] |
## 代码单元格(可直接运行)
# ==========================================
# 唯一化及其他集合逻辑
# ==========================================
import numpy as np
print("=" * 50)
print("1. unique() - 唯一值")
print("=" * 50)
arr = np.array([12, 11, 34, 23, 12, 8, 11])
print(f"原数组: {arr}")
print(f"np.unique(arr): {np.unique(arr)}")
print("\n" + "=" * 50)
print("2. unique() 参数详解")
print("=" * 50)
# return_index
unique, indices = np.unique(arr, return_index=True)
print(f"return_index=True:")
print(f" 唯一值: {unique}")
print(f" 首次出现索引: {indices}")
# return_counts
unique, counts = np.unique(arr, return_counts=True)
print(f"\nreturn_counts=True:")
print(f" 唯一值: {unique}")
print(f" 出现次数: {counts}")
# return_inverse
unique, inverse = np.unique(arr, return_inverse=True)
print(f"\nreturn_inverse=True:")
print(f" 唯一值: {unique}")
print(f" 重构索引: {inverse}")
print(f" 用索引重构: {unique[inverse]}")
print("\n" + "=" * 50)
print("3. 集合逻辑函数")
print("=" * 50)
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([4, 5, 6, 7, 8])
print(f"arr1: {arr1}")
print(f"arr2: {arr2}")
print(f"交集 (intersect1d): {np.intersect1d(arr1, arr2)}")
print(f"并集 (union1d): {np.union1d(arr1, arr2)}")
print(f"差集 (setdiff1d arr1 - arr2): {np.setdiff1d(arr1, arr2)}")
print(f"对称差 (setxor1d): {np.setxor1d(arr1, arr2)}")
print(f"成员检查 (in1d): {np.in1d(arr1, arr2)}")
print("\n" + "=" * 50)
print("4. 实际应用场景")
print("=" * 50)
# 统计出现频率
data = np.array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])
values, counts = np.unique(data, return_counts=True)
print("统计频率:")
for v, c in zip(values, counts):
print(f" {v} 出现 {c} 次")
# 去重
data = np.array([5, 3, 5, 1, 3, 2, 5, 1])
print(f"\n原数组: {data}")
print(f"去重后: {np.unique(data)}")
# 找出缺失的元素
expected = np.array([1, 2, 3, 4, 5])
actual = np.array([1, 2, 4, 5])
missing = np.setdiff1d(expected, actual)
print(f"\n期望值: {expected}")
print(f"实际值: {actual}")
print(f"缺失值: {missing}")
唯一化及其他集合逻辑 - in1d()
in1d() 函数用于判断数组中的元素是否在另一个数组中存在,返回一个布尔型数组。
语法
np.in1d(a, b)
import numpy as np
arr = np.array([12, 11, 34, 23, 12, 8, 11])
result = np.in1d(arr, [11, 12])
print(result)
唯一化及其他集合逻辑
NumPy 提供的集合函数,用于对一维数组进行集合运算。
NumPy 集合函数速查表
==========================================
函数 描述 示例 unique(x) 唯一值(有序) [1,2,3] intersect1d(x,y) 交集 [2,3] union1d(x,y) 并集 [1,2,3,4] in1d(x,y) 成员检查(布尔数组) [True,False] setdiff1d(x,y) 差集(x-y) [1] setxor1d(x,y) 对称差 [1,4]
import numpy as np
x = np.array([1, 2, 3])
y = np.array([2, 3, 4])
print("x =", x)
print("y =", y)
print()
print("unique(x): ", np.unique(x))
print("intersect1d(x, y): ", np.intersect1d(x, y))
print("union1d(x, y): ", np.union1d(x, y))
print("in1d(x, y): ", np.in1d(x, y))
print("setdiff1d(x, y): ", np.setdiff1d(x, y))
print("setxor1d(x, y): ", np.setxor1d(x, y))
import numpy as np
arr = np.array([[6, 3, 4], [7, 5, 2]])
print("原数组:")
print(arr)
print()
arr.sort(axis=-2)
print("arr.sort(axis=-2) 后:")
print(arr)
print("""
原理解释
axis=-2 在二维数组中的含义
对于二维数组:
axis=-1 表示最后一个轴(水平方向/行内axis=1)→ 按行排序
axis=-2 表示倒数第二个轴(垂直方向/列间axis=0)→ 按列排序""")
09 线性代数模块
线性代数模块 - numpy.linalg
numpy.linalg 模块包含了一组标准的矩阵分解运算,以及逆矩阵、行列式等线性代数运算。
重要区别:* vs @ / dot()
| 运算 | 符号/函数 | 说明 |
|---|---|---|
| 元素级乘法 | a * b |
对应位置元素相乘(Hadamard积) |
| 矩阵点积 | a @ b 或 np.dot(a, b) |
标准的矩阵乘法 |
import numpy as np
# 创建两个矩阵
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6],
[7, 8]])
print("=" * 50)
print("矩阵 A:")
print(A)
print("\n矩阵 B:")
print(B)
print("\n" + "=" * 50)
print("元素级乘法 (A * B)")
print("=" * 50)
result = A * B
print(result)
print("说明: 对应位置元素相乘")
print("\n" + "=" * 50)
print("矩阵点积 (A @ B)")
print("=" * 50)
result = A @ B
print(result)
print("说明: 标准的矩阵乘法")
# 等价写法
print("\n等价写法:")
print("A @ B =", A @ B)
print("np.dot(A, B) =", np.dot(A, B))
函数 描述 np.linalg.inv(A) 计算矩阵 A 的逆矩阵 np.linalg.det(A) 计算矩阵 A 的行列式 np.linalg.matrix_power(A, n) 计算矩阵 A 的 n 次幂 np.linalg.eig(A) 计算矩阵 A 的特征值和特征向量 np.linalg.solve(A, b) 求解线性方程组 Ax = b np.linalg.qr(A) 计算矩阵 A 的 QR 分解 np.linalg.svd(A) 计算矩阵 A 的奇异值分解 np.trace(A) 计算矩阵 A 的迹(对角线元素之和) np.linalg.norm(A) 计算矩阵或向量的范数
a=np.array([[80,86],
[82,80],
[85,78],
[90,90],
[86,82],
[78,80],
[92,94]])
b=np.array([[0.8],
[0.2]])
re=a.T
print(re)
res=re * b
print(res)
resul=np.sum(res,axis=0)
print(resul)
a=np.array([[80,86],
[82,80],
[85,78],
[90,90],
[86,82],
[78,80],
[92,94]])
b=np.array([[0.8,0.2]])
re=b@a.T
print(re)
随机数模块 - numpy.random
与 Python 内置的 random 模块相比,NumPy 的 random 模块功能更强大,可以高效生成多种概率分布的样本值。
常用随机函数速查表
| 函数 | 描述 | 示例 |
|---|---|---|
rand(d0, d1, ..., dn) |
生成 [0, 1) 区间内均匀分布的随机浮点数 | np.random.rand(3, 3) |
randn(d0, d1, ..., dn) |
生成标准正态分布(均值为0,方差为1)的随机数 | np.random.randn(2, 3) |
randint(low, high, size) |
生成指定区间内的随机整数 | np.random.randint(0, 10, size=(2, 3)) |
random(size) |
生成 [0, 1) 区间内均匀分布的随机浮点数 | np.random.random((2, 3)) |
uniform(low, high, size) |
生成指定区间内的均匀分布随机数 | np.random.uniform(0, 1, size=(2, 3)) |
normal(loc, scale, size) |
生成正态分布随机数 | np.random.normal(0, 1, size=(2, 3)) |
seed(n) |
设置随机种子,保证结果可复现 | np.random.seed(42) |
## 代码单元格(可直接运行)
# ==========================================
# 随机数模块 - numpy.random
# ==========================================
import numpy as np
print("=" * 50)
print("numpy.random 常用函数")
print("=" * 50)
# 1. rand() - 均匀分布 [0, 1)
print("\n1. rand() - [0, 1) 均匀分布")
print("-" * 30)
print(f"np.random.rand(): {np.random.rand()}")
print(f"np.random.rand(3): {np.random.rand(3)}")
print("np.random.rand(3, 3):")
print(np.random.rand(3, 3))
# 2. randn() - 标准正态分布
print("\n2. randn() - 标准正态分布 (均值=0, 标准差=1)")
print("-" * 30)
print(f"np.random.randn(3): {np.random.randn(3)}")
print("np.random.randn(2, 3):")
print(np.random.randn(2, 3))
# 3. randint() - 随机整数
print("\n3. randint() - 随机整数")
print("-" * 30)
print(f"np.random.randint(0, 10): {np.random.randint(0, 10)}")
print(f"np.random.randint(0, 10, size=5): {np.random.randint(0, 10, size=5)}")
print("np.random.randint(0, 10, size=(2, 3)):")
print(np.random.randint(0, 10, size=(2, 3)))
# 4. random() - 均匀分布
print("\n4. random() - [0, 1) 均匀分布")
print("-" * 30)
print("np.random.random((2, 3)):")
print(np.random.random((2, 3)))
# 5. uniform() - 指定区间均匀分布
print("\n5. uniform() - 指定区间均匀分布")
print("-" * 30)
print("np.random.uniform(5, 10, size=(2, 3)):")
print(np.random.uniform(5, 10, size=(2, 3)))
# 6. normal() - 正态分布
print("\n6. normal() - 正态分布")
print("-" * 30)
print("np.random.normal(10, 2, size=(2, 3)):")
print(np.random.normal(10, 2, size=(2, 3)))
# 7. seed() - 设置随机种子
print("\n7. seed() - 设置随机种子")
print("-" * 30)
np.random.seed(42)
print(f"种子=42 第一次: {np.random.rand(3)}")
np.random.seed(42)
print(f"种子=42 第二次: {np.random.rand(3)}")
print("说明: 相同种子生成的随机数相同")
# 8. 综合示例
print("\n" + "=" * 50)
print("综合示例 - 学生成绩")
print("=" * 50)
np.random.seed(42)
scores = np.random.randint(80, 101, size=(5, 3))
print("随机生成的学生成绩 (5人 × 3门):")
print(scores)
print(f"\n各科平均分: {np.mean(scores, axis=0)}")
print(f"每个学生总分: {np.sum(scores, axis=1)}")
weights = np.random.rand(3)
weights = weights / np.sum(weights)
print(f"\n随机权重: {weights}")
print(f"加权总分: {scores@weights}")
案例:酒鬼漫步
import numpy as np
step=2000
draws=np.random.randint(0,2,size=step)
draws
#当元素为1:向前移动
#当元素为0:向后移动
direction_steps=np.where(draws>0,1,-1)
direction_steps
#数组累计求和
distance=direction_steps.cumsum()
#使用max函数计算向前走得最远的距离
distance.max()
#使用max函数计算向前走得最远的距离
distance.min()
#步长为0.5米
steps=7/0.5
distance_ads=np.abs(distance)
(distance_ads>=steps).argmax()

浙公网安备 33010602011771号