Python数据分析 NumPy矩阵与通用函数及统计分析 ② 第二节

NumPy矩阵与通用函数及统计分析案例

  • NumPy矩阵与通用函数及统计分析
    • 一、掌握NumPy矩阵与通用函数
      • 代码 2 - 30:矩阵的创建
      • 代码 2 - 31:数组的创建与组合
      • 代码 2 - 32:矩阵的运算
      • 代码 2 - 33:矩阵的转置、逆矩阵和二维数组视图
      • 代码 2 - 34:数组的基本运算
      • 代码 2 - 35:数组的比较运算
      • 代码 2 - 36:数组的逻辑运算
      • 代码 2 - 37:数组的广播相加(一维数组加到二维数组)
      • 代码 2 - 38:数组的广播相加(一维数组加到二维数组的不同维度)
    • 二、利用NumPy进行统计分析
      • 代码 2 - 39:数组的保存(单个数组)
      • 代码 2 - 40:数组的保存(多个数组)
      • 代码 2 - 41:数组的读取(单个数组和多个数组)
      • 代码 2 - 42:数组的保存和读取(文本格式)
      • 代码 2 - 43:数组的读取(文本格式,使用genfromtxt)
      • 代码 2 - 44:数组的排序
      • 代码 2 - 45:返回排序后的索引
      • 代码 2 - 46:多个键值排序
      • 代码 2 - 47:数组的去重
      • 代码 2 - 48:数组的重复(使用tile)
      • 代码 2 - 49:数组的重复(使用repeat)
      • 代码 2 - 50:数组的统计计算
      • 代码 2 - 51:数组的累计和与累计积

NumPy矩阵与通用函数及统计分析

一、掌握NumPy矩阵与通用函数

代码 2 - 30:矩阵的创建

import numpy as np  # 导入NumPy库
matr1 = np.mat('1 2 3; 4 5 6; 7 8 9')  # 使用分号隔开数据
print('创建的矩阵为:\n', matr1)

matr2 = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print('创建的矩阵为:\n', matr2)

代码解析
这段代码主要展示了两种创建矩阵的方法。np.mat函数可以通过字符串形式创建矩阵,字符串中用分号隔开不同的行;np.matrix函数则可以通过嵌套列表的形式创建矩阵。

代码 2 - 31:数组的创建与组合

arr1 = np.eye(3)
print('创建的数组1为:\n', arr1)

arr2 = 3 * arr1
print('创建的数组2为:\n', arr2)

print('创建的矩阵为:\n', np.bmat('arr1 arr2; arr1 arr2'))

代码解析
np.eye(3)创建了一个3x3的单位矩阵arr1,然后将arr1乘以3得到arr2np.bmat函数用于从数组、矩阵或字符串构建一个大矩阵,这里将arr1arr2组合成一个更大的矩阵。

代码 2 - 32:矩阵的运算

matr1 = np.mat('1 2 3; 4 5 6; 7 8 9')  # 创建矩阵
print('创建的矩阵为:\n', matr1)

matr2 = matr1 * 3  # 矩阵与数相乘
print('创建的矩阵为:\n', matr2)
print('矩阵相加结果为:\n', matr1 + matr2)  # 矩阵相加
print('矩阵相减结果为:\n', matr1 - matr2)  # 矩阵相减
print('矩阵相乘结果为:\n', matr1 * matr2)  # 矩阵相乘
print('矩阵对应元素相乘结果为:\n', np.multiply(matr1, matr2))

代码解析
首先创建了矩阵matr1,然后将其乘以3得到matr2。接着展示了矩阵的加法、减法、乘法运算,以及对应元素相乘的运算,其中矩阵相乘使用*运算符,对应元素相乘使用np.multiply函数。

代码 2 - 33:矩阵的转置、逆矩阵和二维数组视图

matr3 = np.mat([[6, 2, 1], [1, 5, 2], [3, 4, 8]])
print('矩阵转置结果为:\n', matr3.T)  # 转置
print('矩阵的逆矩阵结果为:\n', matr3.I)  # 逆矩阵
print('矩阵的二维数组结果为:\n', matr3.A)  # 返回二维数组的视图

代码解析
创建矩阵matr3,通过.T属性获取矩阵的转置,通过.I属性获取矩阵的逆矩阵,通过.A属性获取矩阵的二维数组视图。

代码 2 - 34:数组的基本运算

x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
print('数组相加结果为:', x + y)  # 数组相加
print('数组相减结果为:', x - y)  # 数组相减
print('数组相乘结果为:', x * y)  # 数组相乘
print('数组相除结果为:', x / y)  # 数组相除
print('数组幂运算结果为:', x ** y)  # 数组幂运算

代码解析
创建两个数组xy,然后分别进行数组的加法、减法、乘法、除法和幂运算,这些运算都是对应元素之间的运算。

代码 2 - 35:数组的比较运算

x = np.array([1, 3, 5])
y = np.array([2, 3, 4])
print('数组比较结果为:', x < y)
print('数组比较结果为:', x > y)
print('数组比较结果为:', x == y)
print('数组比较结果为:', x >= y)
print('数组比较结果为:', x <= y)
print('数组比较结果为:', x != y)

代码解析
创建两个数组xy,然后进行各种比较运算,返回的是布尔数组,表示对应元素的比较结果。

代码 2 - 36:数组的逻辑运算

print('数组逻辑运算结果为:', np.all(x == y))  # np.all表示逻辑and
print('数组逻辑运算结果为:', np.any(x == y))  # np.any表示逻辑or

代码解析
np.all函数用于判断数组中所有元素是否都满足某个条件,np.any函数用于判断数组中是否有任何元素满足某个条件,这里判断xy对应元素是否相等。

代码 2 - 37:数组的广播相加(一维数组加到二维数组)

arr1 = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
print('创建的数组1为:\n', arr1)
print('数组1的shape为:', arr1.shape)
arr2 = np.array([1, 2, 3]) 
print('创建的数组2为:', arr2)
print('数组2的shape为:', arr2.shape)
print('数组相加结果为:\n', arr1 + arr2)

代码解析
创建二维数组arr1和一维数组arr2,由于NumPy的广播机制,一维数组arr2会自动扩展到与arr1相同的形状,然后进行元素相加。

代码 2 - 38:数组的广播相加(一维数组加到二维数组的不同维度)

arr1 = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
print('创建的数组1为:\n', arr1)
print('数组1的shape为:', arr1.shape)

arr2 = np.array([1, 2, 3, 4]).reshape((4, 1))
print('创建的数组2为:\n', arr2)

print('数组2的shape为:', arr2.shape)
print('数组相加结果为:\n', arr1 + arr2)

代码解析
创建二维数组arr1和一维数组arr2,将arr2通过reshape方法转换为二维数组,然后由于广播机制,arr2会在列方向上扩展到与arr1相同的形状,再进行元素相加。

二、利用NumPy进行统计分析

代码 2 - 39:数组的保存(单个数组)

import numpy as np  # 导入NumPy库
arr = np.arange(100).reshape(10, 10)  # 创建一个数组
np.save('../tmp/save_arr', arr)  # 保存数组
print('保存的数组为:\n', arr)

代码解析
创建一个10x10的数组arr,然后使用np.save函数将数组保存到指定文件中。

代码 2 - 40:数组的保存(多个数组)

arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.arange(0, 1.0, 0.1)
np.savez('../tmp/savez_arr', arr1, arr2)
print('保存的数组1为:', arr1)
print('保存的数组2为:', arr2)

代码解析
创建两个数组arr1arr2,然后使用np.savez函数将多个数组保存到一个文件中。

代码 2 - 41:数组的读取(单个数组和多个数组)

# 读取含有单个数组的文件
loaded_data = np.load('../tmp/save_arr.npy')  
print('读取的数组为:\n', loaded_data)
 # 读取含有多个数组的文件
loaded_data1 = np.load('../tmp/savez_arr.npz') 
print('读取的数组1为:\n', loaded_data1['arr_0'])
print('读取的数组2为:', loaded_data1['arr_1'])

代码解析
使用np.load函数读取保存的数组文件,对于单个数组文件,直接读取即可;对于多个数组文件,读取后可以通过数组名(如arr_0arr_1)来访问不同的数组。

代码 2 - 42:数组的保存和读取(文本格式)

arr = np.arange(0, 12, 0.5).reshape(4, -1)
print('创建的数组为:\n', arr)

# fmt='%d'表示保存为整数
np.savetxt('../tmp/arr.txt', arr, fmt='%d', delimiter=',')
# 读入的时候也需要指定逗号分隔
loaded_data = np.loadtxt('../tmp/arr.txt', delimiter=',') 
print('读取的数组为:\n', loaded_data)

代码解析
创建一个数组arr,使用np.savetxt函数将数组保存为文本文件,指定保存格式为整数,分隔符为逗号。读取时使用np.loadtxt函数,同样指定分隔符为逗号。

代码 2 - 43:数组的读取(文本格式,使用genfromtxt)

loaded_data = np.genfromtxt('../tmp/arr.txt', delimiter=',')
print('读取的数组为:\n', loaded_data)

代码解析
使用np.genfromtxt函数从文本文件中读取数组,同样指定分隔符为逗号。

代码 2 - 44:数组的排序

np.random.seed(42)  # 设置随机种子
arr = np.random.randint(1, 10, size=10)  # 生成随机数组
print('创建的数组为:', arr)

arr.sort()  # 直接排序
print('排序后数组为:', arr)

np.random.seed(42)  # 设置随机种子
arr = np.random.randint(1, 10, size=(3, 3))  # 生成3行3列的随机数组
print('创建的数组为:\n', arr)

arr.sort(axis=1)  # 沿着横轴排序
print('排序后数组为:\n', arr)

arr.sort(axis=0)  # 沿着纵轴排序
print('排序后数组为:\n', arr)

代码解析
首先生成一个一维随机数组并进行排序,然后生成一个二维随机数组,分别沿着横轴(axis=1)和纵轴(axis=0)进行排序。

代码 2 - 45:返回排序后的索引

arr = np.array([2, 3 , 6, 8, 0, 7])
print('创建的数组为:', arr)
print('排序后数组为:', arr.argsort())  # 返回值为重新排序值的下标

代码解析
创建一个数组arr,使用argsort方法返回排序后的元素索引。

代码 2 - 46:多个键值排序

a = np.array([3, 2, 6, 4, 5])
b = np.array([50, 30, 40, 20, 10])
c = np.array([400, 300, 600, 100, 200])
d = np.lexsort((a, b, c))  # lexsort函数只接受一个参数,即(a,b,c)
# 多个键值排序是按照最后一个传入数据计算的
print('排序后数组为:\n', list(zip(a[d], b[d], c[d])))

代码解析
创建三个数组abc,使用np.lexsort函数进行多个键值排序,按照最后一个传入的数组c进行排序,最后将排序后的数组元素打包输出。

代码 2 - 47:数组的去重

names = np.array(['小明', '小黄', '小花', '小明', 
    '小花', '小兰', '小白'])
print('创建的数组为:', names)

print('去重后的数组为:', np.unique(names))

# 跟np.unique函数等价的Python代码实现过程
print('去重后的数组为:', sorted(set(names)))
# 创建数值型数据
ints = np.array([1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10])
print('创建的数组为:', ints)
print('去重后的数组为:', np.unique(ints))

代码解析
创建一个字符串数组names和一个数值数组ints,使用np.unique函数对数组进行去重,同时展示了使用Python的setsorted函数实现去重的方法。

代码 2 - 48:数组的重复(使用tile)

arr = np.arange(5)
print('创建的数组为:', arr)
print('重复后数组为:', np.tile(arr, 3))  # 对数组进行重复

代码解析
创建一个数组arr,使用np.tile函数将数组重复3次。

代码 2 - 49:数组的重复(使用repeat)

np.random.seed(42)  # 设置随机种子
arr = np.random.randint(0, 10,size=(3, 3))
print('创建的数组为:\n', arr)
print('重复后数组为:\n', arr.repeat(2, axis=0))  # 按行进行元素重复
print('重复后数组为:\n', arr.repeat(2, axis=1))  # 按列进行元素重复

代码解析
创建一个二维随机数组arr,使用repeat方法按行(axis=0)和按列(axis=1)分别将元素重复2次。

代码 2 - 50:数组的统计计算

arr = np.arange(20).reshape(4, 5)
print('创建的数组为:\n', arr)
print('数组的和为:', np.sum(arr))  # 计算数组的和
print('数组横轴的和为:', arr.sum(axis=0))  # 沿着横轴计算求和
print('数组纵轴的和为:', arr.sum(axis=1))  # 沿着纵轴计算求和
print('数组的均值为:', np.mean(arr))  # 计算数组均值
print('数组横轴的均值为:', arr.mean(axis=0))  # 沿着横轴计算数组均值
print('数组纵轴的均值为:', arr.mean(axis=1))  # 沿着纵轴计算数组均值
print('数组的标准差为:', np.std(arr))  # 计算数组标准差
print('数组的方差为:', np.var(arr))  # 计算数组方差
print('数组的最小值为:', np.min(arr))  # 计算数组最小值
print('数组的最大值为:', np.max(arr))  # 计算数组最大值
print('数组的最小元素为:', np.argmin(arr))  # 返回数组最小元素的索引
print('数组的最大元素为:', np.argmax(arr))  # 返回数组最大元素的索引

代码解析
创建一个二维数组arr,然后计算数组的和、均值、标准差、方差、最小值、最大值以及最小和最大元素的索引,分别沿着横轴和纵轴进行计算。

代码 2 - 51:数组的累计和与累计积

arr = np.arange(2, 10)
print('创建的数组为:', arr)
print('数组元素的累计和为:', np.cumsum(arr))  # 计算所有元素的累计和
print('数组元素的累计积为:\n', np.cumprod(arr))  # 计算所有元素的累计积

代码解析
创建一个数组arr,使用np.cumsum函数计算数组元素的累计和,使用np.cumprod函数计算

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978487.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot】——分组校验、自定义注解、登入验证(集成redis)、属性配置方式、多环境开发系统学习知识

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大三学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

TCP/IP 5层协议簇:物理层

目录 1. 物理层&#xff08;physical layer&#xff09; 2. 网线/双绞线 1. 物理层&#xff08;physical layer&#xff09; 工作设备&#xff1a;网线、光纤、空气 传输的东西是比特bit 基本单位如下&#xff1a;数字信号 信号&#xff1a;【模拟信号&#xff08;放大器&a…

【C/C++】理解C++内存与Linux虚拟地址空间的关系---带你通透C++中所有数据

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论&#xff1a; 本质编写的原因是我在复习过程中突然发现虚拟地址空间和C内存划分我好想有点分不清时&#xff0c;进行查询各类资料和整理各类文章后得出的文章&#xff…

(论文)检测部分欺骗音频的初步调查

Paper–An Initial Investigation for Detecting Partially Spoofed Audio 摘要 所有现有的欺骗性语音数据库都包含整个欺骗性的攻击数据。 在实践中&#xff0c;使用仅部分欺骗的话语来装载成功的攻击是完全合理的。根据定义&#xff0c;部分欺骗的话语包含欺骗和真实段的混…

P9420 [蓝桥杯 2023 国 B] 子 2023

P9420 [蓝桥杯 2023 国 B] 子 2023 题目 分析代码 题目 分析 刚拿到这道题&#xff0c;我大脑简单算了一下&#xff0c;这个值太大了&#xff0c;直观感觉就很难&#xff01;&#xff01; 但是&#xff0c;你仔仔细细的一看&#xff0c;先从最简单的第一步入手&#xff0c;再…

第4章 4.4 EF Core数据库迁移 Add-Migration UpDate-Database

4.4.1 数据库迁移原理 总结一下就是&#xff1a; 1. 数据库迁移命令的执行&#xff0c;其实就是生成在数据库执行的脚本代码&#xff08;两个文件&#xff1a;数字_迁移名.cs 数字_迁移名.Designer.cs&#xff09;&#xff0c;用于对数据库进行定义和修饰。 2. 数据库迁移…

C++程序员内功修炼——Linux C/C++编程技术汇总

在软件开发的宏大版图中&#xff0c;C 语言宛如一座巍峨的高山&#xff0c;吸引着无数开发者攀登探索。而 Linux 操作系统&#xff0c;以其开源、稳定、高效的特性&#xff0c;成为了众多开发者钟爱的开发平台。将 C 与 Linux 相结合&#xff0c;就如同为开发者配备了一把无坚不…

ubuntu:桌面版磁盘合并扩容

下载gparted磁盘编辑器 apt-get install gparted 打开gparted 更改目标分区大小 当遇到这个报错时&#xff0c;需要在命令行执行原分区的挂载指令 查看该分区信息 记住该目录&#xff0c;并在命令行执行 mount -o remount -rw /# 示例&#xff1a;mount -o remount -rw /v…

使用 Containerd 通过 HTTP 协议拉取 Harbor 私有镜像仓库的镜像

在 Kubernetes 1.24及以上版本环境中&#xff0c;docker不再被支持&#xff0c;主要使用Containerd 是常用的容器运行。默认情况下&#xff0c;Containerd 使用 HTTPS 协议与镜像仓库通信。然而&#xff0c;在某些场景下&#xff08;如测试环境或内部网络&#xff09;&#xff…

【论文笔记-TPAMI 2024】FreqFusion:用于密集图像预测的频率感知特征融合

Frequency-aware Feature Fusion for Dense Image Prediction 用于密集图像预测的频率感知特征融合 Abstract&#xff1a;密集图像预测任务要求具有强类别信息和高分辨率精确空间边界细节的特征。为了实现这一点&#xff0c;现代分层模型通常利用特征融合&#xff0c;直接添加…

PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍

2025-02-22 20:10物联全栈123 尊敬的诸位&#xff01;我是一名物联网工程师。关注我&#xff0c;持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能 RAG知识库搭建的过程中&#xff0c;扫描档pdf的支持和准确率一直是个大家都不愿主动提起的事情…

【deepseek】本地部署+webui访问

背景 最近deepseek很火&#xff0c;但是官网的老是被限流使用&#xff0c;还有就是自己也想着玩一玩&#xff0c;于是准备在自己电脑跑一个 直接附上结果地址mydeepseek 准备工作 windows和linux都可 我这里选择linux&#xff0c;ubuntu系统 安装ollama 看下图&#xff0…

【Vue工作原理】初始化启动文件加载流程

参考资料&#xff1a;配置参考 | Vue CLI vue-cli项目如果项目根目录下没有vue-config.js文件&#xff0c;默认入口文件entry&#xff0c;模板文件template&#xff0c;以及filename分别是什么?&#xff08;参考DeepSeek回答&#xff09; 根据Vue CLI文档&#xff0c;当没有配…

【构建工具】Gradle 8中Android BuildConfig的变化与开启方法

随着Gradle 8的发布&#xff0c;Android开发者需要注意一个重要变化&#xff1a;BuildConfig类的生成现在默认被关闭了&#xff01;&#xff01;&#xff01;。这个变化可能会影响许多依赖于BuildConfig的项目&#xff08;别问&#xff0c;问就是我也被影响了&#xff0c;多好用…

ESP32S3:参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路 (实现各个平台移植使用该方式)

目录 引言使用SPI + DMA 方式实现思路分析1. 查看WS2812的datasheet手册2. 根据官方的led_strip组件的方式,自己手把手实现一遍3.完整的程序(实现霓虹灯效果)引言 参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路,只有明白实现的思路,方能将其…

每日Attention学习24——Strip Convolution Block

模块出处 [TIP 21] [link] CoANet: Connectivity Attention Network for Road Extraction From Satellite Imagery 模块名称 Strip Convolution Block (SCB) 模块作用 多方向条形特征提取 模块结构 模块特点 类PSP设计&#xff0c;采用四个并行分支提取不同维度的信息相比于…

ctfshow——版本控制泄露源码

题目提示&#xff1a;版本控制很重要&#xff0c;但不要部署到生产环境更重要。 题目内容如下图所示 本题结合题目和提示可以知道&#xff0c;我们要通过查看生产环境来查找flag。 所以我们可以在URL上进行操作&#xff0c;这时候就需要目录扫描来查看了。 发现存在一个.git的…

关于网络端口探测:TCP端口和UDP端口探测区别

网络端口探测是网络安全领域中的一项基础技术&#xff0c;它用于识别目标主机上开放的端口以及运行在这些端口上的服务。这项技术对于网络管理和安全评估至关重要。在网络端口探测中&#xff0c;最常用的两种协议是TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用…

某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案 安科瑞 耿笠

摘要&#xff1a;纯电动商用车的工作环境存在路况复杂、工况恶劣等情况&#xff0c;导致整车电气设备的磨损速率加快&#xff0c;造成电气设备绝缘电阻持续下降&#xff0c;如不及时处理&#xff0c;可能存在安全隐患或引发重大安全事故。文章从绝缘故障检测原理出发&#xff0…

LeetCode详解之如何一步步优化到最佳解法:14. 最长公共前缀

LeetCode详解系列的总目录&#xff08;持续更新中&#xff09;&#xff1a;LeetCode详解之如何一步步优化到最佳解法&#xff1a;前100题目录&#xff08;更新中...&#xff09;-CSDN博客 LeetCode详解系列的上一题链接&#xff1a;LeetCode详解之如何一步步优化到最佳解法&am…