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

NumPy 详解

NumPy 详解

NumPy(Numerical Python)是 Python 科学计算的核心库,提供高性能的多维数组对象和计算工具。它是 Pandas、SciPy、Matplotlib 等库的基础。


1. 核心:ndarray 数组

NumPy 的核心是 ndarray(N-dimensional array)对象:

  • 同质数据:所有元素类型相同
  • 高效存储:连续内存块存储
  • 向量化操作:避免显式循环

创建数组

import numpy as np# 从列表创建
arr = np.array([1, 2, 3, 4]) # 特殊数组
zeros = np.zeros((3, 4))      # 3x4全0数组
ones = np.ones((2, 3))        # 2x3全1数组
empty = np.empty((2, 2))      # 未初始化数组
arange = np.arange(0, 10, 2)  # [0, 2, 4, 6, 8]
linspace = np.linspace(0, 1, 5) # [0., 0.25, 0.5, 0.75, 1.]

2. 数组属性
arr = np.array([[1, 2, 3], [4, 5, 6]])print(arr.ndim)    # 维度数: 2
print(arr.shape)   # 形状: (2, 3)
print(arr.size)    # 元素总数: 6
print(arr.dtype)   # 元素类型: int64
print(arr.itemsize) # 元素字节大小: 8

3. 数组索引与切片
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 基本索引
print(arr[0, 1])   # 2# 切片
print(arr[:2, 1:]) # [[2,3],[5,6]]# 布尔索引
mask = arr > 4
print(arr[mask])   # [5,6,7,8,9]# 花式索引
print(arr[[0, 2]]) # [[1,2,3],[7,8,9]]

4. 数组操作

形状操作

arr = np.arange(6).reshape(2, 3)  # 改变形状
flat = arr.flatten()               # 展平为一维

数组运算

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])print(a + b)   # [5,7,9]
print(a * 2)   # [2,4,6]
print(np.dot(a, b))  # 点积: 32

广播机制(不同形状数组运算):

a = np.array([[1,2], [3,4]])
b = np.array([10, 20])print(a + b)  # [[11,22],[13,24]]

5. 数学函数
arr = np.array([1.0, 4.0, 9.0])print(np.sqrt(arr))   # [1., 2., 3.]
print(np.exp(arr))    # 指数计算
print(np.sin(arr))    # 三角函数
print(np.log(arr))    # 自然对数

6. 统计函数
arr = np.arange(12).reshape(3,4)print(np.sum(arr))        # 总和: 66
print(np.mean(arr, axis=0)) # 列均值: [4,5,6,7]
print(np.max(arr, axis=1)) # 行最大值: [3,7,11]
print(np.std(arr))        # 标准差

7. 数组操作函数

拼接

a = np.array([[1,2], [3,4]])
b = np.array([[5,6]])# 垂直拼接
c = np.vstack((a, b))  # [[1,2],[3,4],[5,6]]
# 水平拼接
d = np.hstack((a, b.T)) # [[1,2,5],[3,4,6]]

分割

arr = np.arange(9).reshape(3,3)
result = np.hsplit(arr, 3)  # 水平分割成3份

转置

arr = np.arange(6).reshape(2,3)
print(arr.T)  # [[0,3],[1,4],[2,5]]

8. 线性代数
A = np.array([[1,2], [3,4]])
B = np.array([[5,6], [7,8]])# 矩阵乘法
print(np.dot(A, B))  # 或 A @ B# 求逆矩阵
inv_A = np.linalg.inv(A)# 特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)

9. 随机数生成
# 均匀分布
np.random.rand(2,3)     # [0,1)区间
np.random.uniform(0,10) # [0,10)区间# 正态分布
np.random.randn(2,3)    # 标准正态
np.random.normal(0,1,10)# 均值为0,标准差为1# 随机整数
np.random.randint(0, 10, size=5) # [0,10)的5个整数# 随机种子(重现结果)
np.random.seed(42)

10. 文件操作
# 保存为二进制文件
np.save('data.npy', arr)
loaded_arr = np.load('data.npy')# 文本文件
np.savetxt('data.txt', arr, delimiter=',')
arr_from_txt = np.loadtxt('data.txt', delimiter=',')

性能优势
  • 向量化操作:避免Python循环
  • 内存连续:高效缓存利用
  • 底层优化:使用C/C++/Fortran实现
  • 并行计算:支持SIMD指令
# 向量化 vs 循环 性能对比
import timearr = np.random.rand(1000000)# 向量化操作
start = time.time()
result = np.sin(arr)
print(f"向量化耗时: {time.time()-start:.6f}s")# Python循环
start = time.time()
result = [np.sin(x) for x in arr]
print(f"循环耗时: {time.time()-start:.6f}s")

应用场景
  • 数值计算(微积分、线性代数)
  • 数据处理与清洗
  • 图像处理(像素数组)
  • 机器学习(数据预处理)
  • 科学模拟(物理、生物等领域)

NumPy 是 Python 科学计算生态系统的基石,掌握它将大幅提升数据处理和科学计算能力!

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

相关文章:

  • 【static 修饰局部变量、全局变量、函数】
  • Swift6.0 - 5、基本运算符
  • 账户和组管理
  • JavaEE——死锁
  • PowerBI实现仅在需要图表时显示图表
  • 傅里叶变换算子性质证明
  • GTSuite许可管理常见问题及解决方案
  • 基于FPGA的IIC控制EEPROM读写(1)
  • Mybatis07-逆向工程
  • 《python语言程序设计》2018版第8章5题编写函数统计特定不重复字符串s2在s1中的出现次数
  • C#获取当前系统账户是否为管理员账户
  • 资源利用率提升50%:Serverless 驱动国诚投顾打造智能投顾新范式
  • 用Amazon Q Developer助力Python快捷软件开发
  • EMS4000/EMS3900/EMS4100/EMS3157/EMS/23157高性能高质量模拟开关芯片
  • Go语言自学笔记(2.3-2.6)
  • C++:vector(2)之vector的模拟实现
  • 使用 SeaTunnel 建立从 MySQL 到 Databend 的数据同步管道
  • [2025CVPR-图象检索方向]CCIN:用于合成图像检索的合成冲突识别和中和模型
  • OWASP Top 10 攻击场景实战
  • 简单易懂,什么是连续分配管理方式
  • Vue3+Ts实现父子组件间传值的两种方式
  • 设计模式之【观察者模式】
  • 多维动态规划题解——不同路径【LeetCode】记忆化搜索
  • ai 编程工具,简单总结
  • 16路串口光纤通信FPGA项目实现指南 - 第二部分(下)
  • Day36 Java方法和流程控制练习 计算器
  • Linux运维新手的修炼手扎之第19天
  • Linux内核设计与实现 第1章:内核简介
  • UDP和TCP的主要区别是什么?
  • --- Bean 的生命周期 ---