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

NumPy入门:从数组基础到数学运算

目录

一、NumPy 数组基础

(一)创建数组

(二)数组索引

(三)数组切片

二、数组操作

(一)形状操作

(二)数组合并与分割

三、基本数学运算

(一)加减乘除

(二)矩阵运算

四、小结


NumPy 是 Python 中用于科学计算的核心库,提供了强大的多维数组对象和丰富的工具函数。以下是 NumPy 数组的基础知识和操作详解。

一、NumPy 数组基础

(一)创建数组

numpy.array()是最常用的创建数组方法,接受列表作为输入。同时,也可创建特殊数组,常用于初始化全零、全一、空数组、单位矩阵等数组。

import numpy as np# 使用列表创建一维数组list_1d = [1, 2, 3, 4, 5]arr_1d = np.array(list_1d)print(arr_1d) # 输出:[1 2 3 4 5]# 创建二维数组list_2d = [[1, 2, 3], [4, 5, 6]]arr_2d = np.array(list_2d)print(arr_2d) # 输出:[[1 2 3][4 5 6]]# 创建全零数组zeros = np.zeros(5)print(zeros) # 输出:[0. 0. 0. 0. 0.]# 创建全一阵列ones = np.ones((2, 3))print(ones) # 输出:[[1. 1. 1.][1. 1. 1.]]# 创建空数组,其内容是随机的,因为未初始化empty = np.empty(3)print(empty) # 输出:[随机值 随机值 随机值](具体值因系统而异)# 创建单位矩阵identity = np.eye(3)print(identity) # 输出:[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]

(二)数组索引

  1. 一维数组索引:与 Python 列表类似,使用方括号和索引值。
  1. 二维数组索引:使用两个索引,分别代表行和列。
import numpy as np# 创建一维数组arr = np.array([10, 20, 30, 40, 50])# 索引 1 维数组print(arr[0]) # 输出:10print(arr[-1]) # 输出:50,索引最后一个元素# 创建 2 维数组arr_2d = np.array([[1, 2, 3], [4, 5, 6]])# 索引 2 维数组print(arr_2d[0, 1]) # 输出:2print(arr_2d[1, -1]) # 输出:6

(三)数组切片

  1. 一维数组切片:使用起始索引、结束索引和步长。
  1. 二维数组切片:可以分别对行和列进行切片。
import numpy as np# 创建一维数组arr = np.array([0, 1, 2, 3, 4, 5])# 切片 1 维数组print(arr[1:4]) # 输出:[1 2 3]print(arr[:3]) # 输出:[0 1 2]print(arr[2:]) # 输出:[2 3 4 5]print(arr[::2]) # 输出:[0 2 4]print(arr[1:5:2]) # 输出:[1 3]print(arr[::-1]) # 输出:[5 4 3 2 1],反转数组# 创建 2 维数组arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 切片 2 维数组print(arr_2d[:2, :2]) # 输出:[[1 2][4 5]]print(arr_2d[1:, ::2]) # 输出:[[4 6][7 9]]

二、数组操作

(一)形状操作

  1. 改变数组形状:reshape()方法可以改变数组的形状,但不改变其数据。
  1. 扁平化数组:flatten()和ravel()都可以将多维数组扁平化为一维数组,但它们在处理方式上有所不同(flatten()返回拷贝,ravel()返回视图,可能更高效)。
import numpy as np# 创建数组arr = np.array([[1, 2, 3], [4, 5, 6]])# 改变数组形状reshaped_arr = arr.reshape(3, 2)print(reshaped_arr) # 输出:[[1 2][3 4][5 6]]# 扁平化数组flattened_arr = arr.flatten()print(flattened_arr) # 输出:[1 2 3 4 5 6]# 使用 ravel 扁平化raveled_arr = arr.ravel()print(raveled_arr) # 输出:[1 2 3 4 5 6]

(二)数组合并与分割

  1. 水平合并:hstack()将数组水平拼接。
  1. 垂直合并:vstack()将数组垂直堆叠。
  1. 水平分割:hsplit()将数组水平分割。
  1. 垂直分割:vsplit()将数组垂直分割。
import numpy as np# 创建数组a = np.array([1, 2, 3])b = np.array([4, 5, 6])# 水平合并horizontal_stack = np.hstack((a, b))print(horizontal_stack) # 输出:[1 2 3 4 5 6]# 创建二维数组c = np.array([[1, 2], [3, 4]])d = np.array([[5, 6], [7, 8]])# 垂直合并vertical_stack = np.vstack((c, d))print(vertical_stack) # 输出:[[1 2][3 4][5 6][7 8]]# 创建原数组arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])# 水平分割(分成 2 份)horizontal_split = np.hsplit(arr, 2)print(horizontal_split) # 输出:[array([[1, 2],[5, 6]]), array([[3, 4],[7, 8]])]# 垂直分割(分成 2 份)vertical_split = np.vsplit(arr, 2)print(vertical_split) # 输出:[array([[1, 2, 3, 4]]), array([[5, 6, 7, 8]])]

三、基本数学运算

(一)加减乘除

  1. 加法:对应元素相加。
  1. 减法:对应元素相减。
  1. 乘法:对应元素相乘。
  1. 除法:对应元素相除。
import numpy as np# 创建数组a = np.array([1, 2, 3])b = np.array([4, 5, 6])# 加法add_result = a + bprint(add_result) # 输出:[5 7 9]# 减法subtract_result = a - bprint(subtract_result) # 输出:[-3 -3 -3]# 乘法multiply_result = a * bprint(multiply_result) # 输出:[4 10 18]# 除法divide_result = a / bprint(divide_result) # 输出:[0.25 0.4 0.5 ]

(二)矩阵运算

  1. 矩阵相乘:dot()方法用于矩阵乘法(需满足矩阵乘法规则,即前一矩阵的列数等于后一矩阵的行数)。
  1. 矩阵转置:T属性可以获得矩阵的转置。
  1. 矩阵求逆:linalg.inv()可以计算可逆矩阵的逆矩阵(矩阵需为方阵且行列式不为零)。
import numpy as np# 创建矩阵matrix1 = np.array([[1, 2], [3, 4]])matrix2 = np.array([[5, 6], [7, 8]])# 矩阵相乘matrix_multiply = np.dot(matrix1, matrix2)print(matrix_multiply) # 输出:[[19 22][43 50]]# 矩阵转置transpose_matrix = matrix1.Tprint(transpose_matrix) # 输出:[[1 3][2 4]]# 矩阵求逆(matrix1 的行列式为 -2,可逆)inverse_matrix = np.linalg.inv(matrix1)print(inverse_matrix) # 输出:[[-2. 1. ][ 1.5 -0.5]]

四、小结

通过以上内容,我们学习了 NumPy 数组的基本操作,包括:​

  1. 如何创建不同维度的数组​和对数组进行索引和切片​
  2. 如何改变数组的形状和进行合并分割​
  3. 如何进行基本的数学运算​

NumPy 的核心在于其高效的数组操作能力,建议初学者多实践以上代码示例,并尝试自己创建数组进行各种操作,逐步熟悉 NumPy 的语法和功能。如果需要深入学习某个部分或补充其他内容,欢迎随时告知。

http://www.xdnf.cn/news/90595.html

相关文章:

  • 深度学习中的“重参数化”总结
  • 正点原子TFTLCD扩展
  • 框架开发.idea配置项提示
  • 【算法】BFS-解决FloodFill问题
  • 基于 Spring Boot实现的图书管理系统
  • 强化学习框架:OpenRLHF源码解读,模型处理
  • C++ 算法(12):数组参数传递详解,值传递、指针传递与引用传递
  • pcp补丁升级手顺
  • YOLO系列面试冲刺
  • 深入理解无监督学习:探索数据的潜在结构
  • 基于TCP的协议
  • (数论)Lucas定理
  • linux 手动触发崩溃
  • 多头注意力(Multi‑Head Attention)
  • 鸣潮赞妮技能机制解析 鸣潮赞妮配队推荐
  • 路由交换网络专题 | 第六章 | OSPF | BGP | BGP属性 | 防环机制
  • RS232借助 Profinet网关与调制解调器碰撞出的火花
  • 探秘云原生架构:概念、技术、设计与反模式深度解读
  • strlen参数不匹配编译报错处理
  • 前端做模糊查询(含AI版)
  • 操作系统——堆与栈详解:内存结构全面科普
  • 电商平台比价 API 接口,避免人工比价的低效与误差
  • Mellanox网卡qos设置
  • window如何关闭指定端口
  • 嵌入式人工智能应用-第三章 opencv操作8 图像特征之LBP特征 下
  • 【C++游戏引擎开发】第20篇:基于物理渲染(PBR)——辐射度量学
  • 如何一键提取多个 PPT 幻灯片中的备注到 TXT 记事本文件中
  • 爱普生FC-12M晶振在车载系统中广泛应用
  • Spring事件机制,如何使用Spring事件监听器
  • Vue 实例 VM 访问属性