当前位置: 首页 > news >正文

numpy矩阵运算

NumPy 是 Python 中用于科学计算的核心库,提供了强大的矩阵和数组运算功能。以下是 NumPy 矩阵运算的全面介绍:


一、矩阵创建与基本操作

1. 创建矩阵

import numpy as np# 从列表创建
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("2D数组:\n", matrix)# 创建特殊矩阵
zeros = np.zeros((3, 3))        # 零矩阵
ones = np.ones((2, 4))          # 全1矩阵
identity = np.eye(3)            # 单位矩阵
random_matrix = np.random.rand(3, 3)  # 随机矩阵
range_matrix = np.arange(12).reshape(3, 4)  # 范围矩阵print("零矩阵:\n", zeros)
print("单位矩阵:\n", identity)

2. 矩阵属性

matrix = np.array([[1, 2, 3], [4, 5, 6]])print("形状:", matrix.shape)      # (2, 3)
print("维度:", matrix.ndim)       # 2
print("元素总数:", matrix.size)   # 6
print("数据类型:", matrix.dtype)  # int64

二、基本数学运算

1. 元素级运算

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 基本运算
print("加法:\n", A + B)      # 元素相加
print("减法:\n", A - B)      # 元素相减  
print("乘法:\n", A * B)      # 元素相乘(哈达玛积)
print("除法:\n", A / B)      # 元素相除
print("幂运算:\n", A ** 2)   # 每个元素平方# 广播运算
print("标量加法:\n", A + 10)    # 每个元素加10
print("标量乘法:\n", A * 3)     # 每个元素乘3

2. 矩阵乘法

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 矩阵乘法(点积)
matrix_product = np.dot(A, B)
# 或使用 @ 运算符(Python 3.5+)
matrix_product_alt = A @ Bprint("矩阵乘法:\n", matrix_product)
# [[19 22]
#  [43 50]]

三、线性代数运算

1. 矩阵分解

# 特征值和特征向量
matrix = np.array([[4, -2], [1, 1]])
eigenvalues, eigenvectors = np.linalg.eig(matrix)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)# 奇异值分解 (SVD)
U, S, Vt = np.linalg.svd(matrix)
print("U矩阵:\n", U)
print("奇异值:", S)
print("V转置矩阵:\n", Vt)# QR分解
Q, R = np.linalg.qr(matrix)
print("Q矩阵:\n", Q)
print("R矩阵:\n", R)

2. 矩阵求逆与行列式

matrix = np.array([[1, 2], [3, 4]])# 矩阵求逆
inverse = np.linalg.inv(matrix)
print("逆矩阵:\n", inverse)# 行列式
det = np.linalg.det(matrix)
print("行列式:", det)# 验证:矩阵 × 逆矩阵 = 单位矩阵
identity_check = matrix @ inverse
print("验证逆矩阵:\n", np.round(identity_check, 10))

3. 线性方程组求解

# 解 Ax = b
A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])# 方法1: 直接求解
x = np.linalg.solve(A, b)
print("解向量:", x)  # [2. 3.]# 验证解
print("验证:", A @ x)  # 应该等于 [9, 8]# 方法2: 使用逆矩阵
x_alt = np.linalg.inv(A) @ b
print("逆矩阵解法:", x_alt)

四、统计运算

1. 基本统计

matrix = np.array([[1, 2, 3],[4, 5, 6], [7, 8, 9]])print("总和:", np.sum(matrix))
print("平均值:", np.mean(matrix))
print("标准差:", np.std(matrix))
print("方差:", np.var(matrix))
print("最小值:", np.min(matrix))
print("最大值:", np.max(matrix))# 沿特定轴统计
print("每列总和:", np.sum(matrix, axis=0))   # [12 15 18]
print("每行平均值:", np.mean(matrix, axis=1)) # [2. 5. 8.]

2. 累积运算

matrix = np.array([[1, 2, 3],[4, 5, 6]])print("累积和:\n", np.cumsum(matrix))
# [ 1  3  6 10 15 21]print("按行累积和:\n", np.cumsum(matrix, axis=1))
# [[ 1  3  6]
#  [ 4  9 15]]

五、矩阵操作与变形

1. 矩阵变形

matrix = np.arange(12)
print("原始数组:", matrix)# 改变形状
reshaped = matrix.reshape(3, 4)
print("重塑为3x4:\n", reshaped)# 转置
transposed = reshaped.T
print("转置矩阵:\n", transposed)# 展平
flattened = reshaped.flatten()
print("展平数组:", flattened)

2. 矩阵拼接

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 水平拼接
horizontal = np.hstack([A, B])
print("水平拼接:\n", horizontal)# 垂直拼接
vertical = np.vstack([A, B])
print("垂直拼接:\n", vertical)# 使用 concatenate
concat_axis0 = np.concatenate([A, B], axis=0)  # 垂直
concat_axis1 = np.concatenate([A, B], axis=1)  # 水平

六、高级运算

1. 广播机制

# 向量与矩阵运算
matrix = np.array([[1, 2, 3],[4, 5, 6], [7, 8, 9]])
vector = np.array([10, 20, 30])# 广播:向量被扩展到与矩阵相同的形状
result = matrix + vector
print("矩阵 + 向量:\n", result)
# [[11 22 33]
#  [14 25 36]
#  [17 28 39]]# 更复杂的广播
A = np.array([[1], [2], [3]])  # 形状 (3, 1)
B = np.array([10, 20])         # 形状 (2,)
result = A + B                 # 广播到 (3, 2)
print("复杂广播:\n", result)

2. 矩阵范数

matrix = np.array([[1, 2], [-3, 4]])print("Frobenius范数:", np.linalg.norm(matrix))
print("1-范数:", np.linalg.norm(matrix, ord=1))
print("2-范数:", np.linalg.norm(matrix, ord=2))
print("无穷范数:", np.linalg.norm(matrix, ord=np.inf))

3. 迹与对角元素

matrix = np.array([[1, 2, 3],[4, 5, 6], [7, 8, 9]])print("矩阵的迹:", np.trace(matrix))        # 15 (1+5+9)
print("对角元素:", np.diag(matrix))         # [1 5 9]
print("创建对角矩阵:\n", np.diag([1, 2, 3]))

七、性能优化技巧

1. 向量化操作

import time# 非向量化(慢)
def slow_operation(matrix):result = np.zeros_like(matrix)for i in range(matrix.shape[0]):for j in range(matrix.shape[1]):result[i, j] = matrix[i, j] ** 2 + 2 * matrix[i, j] + 1return result# 向量化(快)
def fast_operation(matrix):return matrix ** 2 + 2 * matrix + 1# 性能测试
large_matrix = np.random.rand(1000, 1000)start = time.time()
result1 = slow_operation(large_matrix)
time1 = time.time() - startstart = time.time()
result2 = fast_operation(large_matrix)
time2 = time.time() - startprint(f"循环版本: {time1:.4f}秒")
print(f"向量化版本: {time2:.4f}秒")
print(f"加速比: {time1/time2:.1f}倍")

2. 内存布局优化

# C顺序 vs F顺序
matrix_c = np.array([[1, 2, 3], [4, 5, 6]], order='C')  # 行优先
matrix_f = np.array([[1, 2, 3], [4, 5, 6]], order='F')  # 列优先print("C顺序:", matrix_c.flags['C_CONTIGUOUS'])  # True
print("F顺序:", matrix_f.flags['F_CONTIGUOUS'])  # True

八、实际应用示例

1. 图像处理模拟

# 模拟灰度图像处理
image = np.random.randint(0, 256, (100, 100), dtype=np.uint8)
print("原始图像形状:", image.shape)# 图像卷积核(边缘检测)
kernel = np.array([[-1, -1, -1],[-1,  8, -1],[-1, -1, -1]])# 简单的卷积操作(简化版)
def simple_convolution(image, kernel):h, w = image.shapekh, kw = kernel.shapepad_h, pad_w = kh // 2, kw // 2# 填充图像padded = np.pad(image, ((pad_h, pad_h), (pad_w, pad_w)), mode='constant')result = np.zeros_like(image, dtype=float)# 卷积计算for i in range(h):for j in range(w):region = padded[i:i+kh, j:j+kw]result[i, j] = np.sum(region * kernel)return np.clip(result, 0, 255).astype(np.uint8)# 应用卷积
edges = simple_convolution(image, kernel)
print("边缘检测完成")

2. 数据标准化

# 生成模拟数据
data = np.random.normal(5, 2, (100, 5))  # 100个样本,5个特征# Z-score标准化
def standardize(data):mean = np.mean(data, axis=0)std = np.std(data, axis=0)return (data - mean) / std# Min-Max标准化  
def normalize(data):min_vals = np.min(data, axis=0)max_vals = np.max(data, axis=0)return (data - min_vals) / (max_vals - min_vals)standardized_data = standardize(data)
normalized_data = normalize(data)print("原始数据均值:", np.mean(data, axis=0))
print("标准化后均值:", np.mean(standardized_data, axis=0))
print("标准化后方差:", np.var(standardized_data, axis=0))

总结

NumPy 矩阵运算的核心优势:

  • 高性能:底层用 C/Fortran 实现
  • 向量化:避免 Python 循环,提升效率
  • 广播机制:智能处理不同形状数组的运算
  • 丰富的线性代数函数:覆盖大多数数学需求

掌握 NumPy 矩阵运算是进行科学计算、机器学习和数据分析的基础。

http://www.dtcms.com/a/431051.html

相关文章:

  • 让 Agent 说“机器能懂的话”——LlamaIndex 构建 Agent 的结构化输出策略
  • 网站建设栏目怎么介绍海南万宁市
  • 2009 年真题配套词汇单词笔记(考研真相)
  • 代充网站怎么做wordpress4.8.2
  • GundamSeed001
  • ESP32 IDF GET_HTTPS
  • 算法世界中的两极对话:最小化最大差值与最大化数字差异的智慧较量
  • 【含文档+PPT+源码】基于微信小程序的关爱老年人在线能力评估系统
  • 前端-JavaScript简介JavaScript模块化
  • 建设官方网站房产信息网的官网链接
  • ◆comfyUI教程◆第1章05节 详解基础工作流节点及参数功能
  • 华为铁三角:销服体系的变革方法论
  • 【数据库知识】TxSQL 主从数据库同步底层原理深度解析
  • 17zwd一起做网站百度地图怎么看沿途服务区
  • 语义场理论中的5个关键概念
  • 如何自己建立网站前端自己做博客网站
  • 812. 最大三角形面积
  • 【开题答辩全过程】以 springboot药店同城配送系统为例,包含答辩的问题和答案
  • 淘小说APP(免费阅读海量小说)
  • 自动化测试系列之pytest<一>
  • 上海自建站招聘网络营销的含义和特点
  • 闵行建设机械网站游戏开发指南
  • 30.响应式联系信息板块,采用 HTML 和 CSS | CSS 新形态设计
  • 高端营销网站建设新出的网络游戏排行榜
  • 湘潭房产网站建设wordpress自定义栏目是什么
  • iBizModel 实体界面行为(PSDEUIACTION)及实体界面行为组(PSDEUAGROUP)模型详解
  • InfiniBand 技术解析(3):解码 IB “黑话”—— 核心术语与架构概览
  • Node.js面试题及详细答案120题(101-110) -- 安全与部署篇
  • 主打社交应用,OpenAI发布视频生成模型Sora2,开启全新互动体验
  • SpringBoot对比FastAPI,优势与劣势