当前位置: 首页 > 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 的语法和功能。如果需要深入学习某个部分或补充其他内容,欢迎随时告知。

相关文章:

  • Redis ⑤-单线程模型 | 常用数据结构
  • 【SAP-CO】成本主数据
  • UWB定位技术在钢铁厂行业中的创新应用与价值实践
  • 代理设计模式:从底层原理到源代码 详解
  • 物理机检查磁盘坏道方式
  • prtobuf的原理
  • 【Luogu】动态规划一
  • TS-300B浊度传感器详解(STM32)
  • STM32单片机入门学习——第46节: [14-1] WDG看门狗
  • Redis在.NET平台中的各种应用场景
  • AI日报 - 2025年4月23日
  • 代理模式(Proxy Pattern)详解:以延迟加载图片为例
  • NLP高频面试题(五十)——大模型(LLMs)分词(Tokenizer)详解
  • 【C++】Json-Rpc框架项目介绍(1)
  • Agent框架LangGraph:实现一个简单的Plan-and-Execute Agent
  • 电子电器架构 --- 面向下一代车辆的演进式(发展演变的)汽车网关
  • 仅追加KV数据库
  • 实验一 进程控制实验
  • 2023蓝帽杯初赛内存取证-4
  • NVIDIA 自动驾驶技术见解
  • 外卖江湖战火重燃,骑手、商家、消费者在“摇摆”什么?
  • 泡泡玛特一季度整体收入同比增超1.6倍,海外收入增近5倍
  • 耐克领跑女性运动市场:持续加码、创新,更多新增长点有望涌现
  • “五一”假期前多地规范旅游市场:要求明码标价,禁止强迫购物
  • 西安雁塔区委书记王征拟任市领导班子副职,曾从浙江跨省调任陕西
  • 包邮到高原,跨越4083公里送妈妈一张按摩椅