【100天精通Python】Day53:Python 数据分析_NumPy数据操作和分析进阶

目录

1. 广播

 2 文件输入和输出

3 随机数生成

4 线性代数操作

 5 进阶操作

6  数据分析示例


1. 广播

        广播是NumPy中的一种机制,用于在不同形状的数组之间执行元素级操作,使它们具有兼容的形状。广播允许你在不显式复制数据的情况下,对不同形状的数组进行运算。当你尝试对形状不同的数组进行操作时,NumPy会自动调整这些数组的形状,使它们具有兼容的形状,以便进行元素级运算。

广播规则和示例: 广播的规则如下:

  1. 如果两个数组的维度不同,将维度较小的数组的形状在其前面补1,直到两个数组的维度相同。
  2. 如果两个数组的形状在某个维度上不一致,但其中一个数组的维度大小为1,那么这个维度的大小将被扩展为与另一个数组相同。
  3. 如果两个数组在任何维度上的大小都不匹配且没有一个维度的大小为1,则广播操作将失败,引发异常。

示例:

  • 广播规则和示例
import numpy as np# 广播示例1:将标量与数组相乘
scalar = 2
array = np.array([1, 2, 3])
result = scalar * array
print("广播示例1结果:", result)  # 输出:[2 4 6]# 广播示例2:将一维数组与二维数组相加
a = np.array([1, 2, 3])
b = np.array([[10, 20, 30], [40, 50, 60]])
result = a + b
print("广播示例2结果:\n", result)
# 输出:
# [[11 22 33]
#  [41 52 63]]# 广播示例3:形状不兼容的情况
a = np.array([1, 2, 3])
b = np.array([10, 20])
try:result = a + b
except ValueError as e:print("广播示例3结果(异常):", e)
# 输出:广播示例3结果(异常):operands could not be broadcast together with shapes (3,) (2,)

 2 文件输入和输出

读取文本文件:

  • np.loadtxt():用于从文本文件中读取数据并返回一个NumPy数组。
  • np.genfromtxt():用于从文本文件中读取数据,并根据需要自动处理缺失值和数据类型。

写入文本文件:

  • np.savetxt():用于将NumPy数组写入文本文件。

读取和写入二进制文件:

  • np.save():将NumPy数组以二进制格式保存到磁盘文件中。
  • np.load():从磁盘文件中加载保存的NumPy数组。

示例:

import numpy as np# 读取文本文件
data = np.loadtxt('data.txt')  # 从文本文件中读取数据# 写入文本文件
np.savetxt('output.txt', data, delimiter=',')  # 将数据写入文本文件,使用逗号作为分隔符# 读取和写入二进制文件
arr = np.array([1, 2, 3])
np.save('array_data.npy', arr)  # 保存数组到二进制文件
loaded_arr = np.load('array_data.npy')  # 从二进制文件中加载数组

3 随机数生成

生成随机数:

  • np.random.rand():生成均匀分布的随机数数组。
  • np.random.randn():生成标准正态分布(平均值为0,标准差为1)的随机数数组。
  • np.random.randint():生成指定范围内的随机整数。

随机种子:

  • np.random.seed():用于设置随机数生成器的种子,以确保生成的随机数可重复。

示例:

import numpy as np# 生成随机数
random_numbers = np.random.rand(3, 3)  # 生成3x3的均匀分布的随机数数组
standard_normal = np.random.randn(2, 2)  # 生成2x2的标准正态分布的随机数数组
random_integers = np.random.randint(1, 10, size=(2, 3))  # 生成2x3的随机整数数组,范围在1到10之间# 设置随机种子以可重复生成相同的随机数
np.random.seed(42)
random_a = np.random.rand(3)
np.random.seed(42)  # 使用相同的种子
random_b = np.random.rand(3)

        当你使用相同的随机种子值(在上述示例中是42)时,np.random 模块将生成相同的随机数序列。这对于研究、实验和调试非常有用,因为它确保了随机性的可复制性。例如:

import numpy as npnp.random.seed(42)
random_a = np.random.rand(3)# 使用相同的种子值生成相同的随机数序列
np.random.seed(42)
random_b = np.random.rand(3)# random_a 和 random_b 应该是相同的
print(random_a)
print(random_b)

        这将产生相同的随机数序列,使得 random_arandom_b 的值相等。

        请注意,如果你在不同地方使用相同的种子值,你将在这些地方生成相同的随机数序列。但是,如果你更改种子值,将生成不同的随机数序列。

        随机数生成和随机种子在模拟、机器学习实验以及需要可重复性的应用中非常重要。使用随机种子可以确保你的实验结果是可复制的,而不受随机性的影响。

4 线性代数操作

        线性代数在科学计算中起着关键作用,NumPy提供了许多用于处理矩阵和向量的线性代数操作。

  • 矩阵乘法:np.dot()@运算符
  • 逆矩阵和伪逆矩阵:np.linalg.inv()np.linalg.pinv()
  • 特征值和特征向量:np.linalg.eig()
  • 奇异值分解(SVD):np.linalg.svd()

矩阵乘法:可以使用 np.dot() 函数或 @ 运算符进行矩阵乘法。

示例:

import numpy as npA = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])result = np.dot(A, B)  # 或者使用 result = A @ B

逆矩阵和伪逆矩阵:可以使用 np.linalg.inv() 计算逆矩阵,以及 np.linalg.pinv() 计算伪逆矩阵(当矩阵不可逆时使用伪逆矩阵)。

示例:

import numpy as npA = np.array([[1, 2], [3, 4]])
inverse_A = np.linalg.inv(A)
pseudo_inverse_A = np.linalg.pinv(A)

特征值和特征向量:可以使用 np.linalg.eig() 计算矩阵的特征值和特征向量。

示例:

import numpy as npA = np.array([[1, 2], [2, 3]])
eigenvalues, eigenvectors = np.linalg.eig(A)

奇异值分解(SVD):可以使用 np.linalg.svd() 进行奇异值分解,将矩阵分解为三个矩阵的乘积。

示例:

import numpy as npA = np.array([[1, 2], [3, 4], [5, 6]])
U, S, VT = np.linalg.svd(A)

 5 进阶操作

5.1 索引和切片技巧:

NumPy允许使用布尔掩码、整数数组索引等高级索引技巧来访问和修改数组的元素。

  1. 基本切片(Basic Slicing)

    • 基本切片通过指定开始索引、结束索引和步长来提取数组的子数组。
    • 示例:arr[2:5] 提取索引2到4的元素,arr[1:5:2] 使用步长提取元素。
  2. 布尔掩码(Boolean Masking)

    • 布尔掩码允许你根据某些条件来选择数组中的元素,条件通常是布尔表达式。
    • 示例:arr[arr > 2] 选择大于2的元素。
  3. 整数数组索引(Integer Array Indexing)

    • 使用整数数组作为索引,可以选择或重排数组中的元素。
    • 示例:arr[indices] 使用整数数组 indices 选择指定索引的元素。
  4. 多维数组切片

    • 对多维数组进行切片时,可以分别指定不同维度的切片条件。
    • 示例:arr2[1:3, 0:2] 选择第2和第3行的前2列。

代码示例:

import numpy as np# 基本切片示例
arr = np.array([0, 1, 2, 3, 4, 5])
sub_array1 = arr[2:5]  # 提取子数组,结果为 [2, 3, 4]
sub_array2 = arr[1:5:2]  # 使用步长,结果为 [1, 3]# 布尔掩码示例
mask = arr > 2
result = arr[mask]  # 选择大于2的元素,结果为 [3, 4, 5]# 整数数组索引示例
indices = np.array([0, 2, 4])
result2 = arr[indices]  # 使用整数数组索引,结果为 [0, 2, 4]# 多维数组切片示例
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
sub_array3 = arr2[1:3, 0:2]  # 选择第2和第3行的前2列
# 结果为
# [[4, 5],
#  [7, 8]]# 输出结果
print("基本切片示例1:", sub_array1)
print("基本切片示例2:", sub_array2)
print("布尔掩码示例:", result)
print("整数数组索引示例:", result2)
print("多维数组切片示例:\n", sub_array3)

5.2 数组排序

        NumPy提供了 np.sort()np.argsort() 用于对数组进行排序和返回排序后的索引。

示例:

import numpy as nparr = np.array([3, 1, 2, 4, 5])
sorted_arr = np.sort(arr)  # 对数组进行排序
sorted_indices = np.argsort(arr)  # 返回排序后的索引

示例1:按值排序

import numpy as nparr = np.array([3, 1, 2, 4, 5])
sorted_arr = np.sort(arr)  # 按值升序排序,结果为[1, 2, 3, 4, 5]

 示例2:按索引排序

import numpy as nparr = np.array([3, 1, 2, 4, 5])
indices = np.argsort(arr)  # 获取按值排序后的索引,结果为[1, 2, 0, 3, 4]
sorted_arr = arr[indices]  # 按索引排序,结果为[1, 2, 3, 4, 5]

5.3 结构化数组

结构化数组允许存储和操作不同数据类型的数据,类似于数据库的表格。

示例:

import numpy as npdata = np.array([(1, 'Alice', 25), (2, 'Bob', 30)],dtype=[('ID', 'i4'), ('Name', 'U10'), ('Age', 'i4')])# 访问结构化数组的元素
print(data['Name'])  # 输出['Alice', 'Bob']

6  数据分析示例

我们将加载一个包含学生考试成绩的CSV文件,计算平均分、分数分布和绘制直方图。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 加载CSV文件数据
data = pd.read_csv('student_scores.csv')# 提取分数列作为NumPy数组
scores = data['Score'].values# 计算统计信息
mean_score = np.mean(scores)
median_score = np.median(scores)
std_deviation = np.std(scores)# 绘制直方图
plt.hist(scores, bins=10, edgecolor='k', alpha=0.7)
plt.title('Score Distribution')
plt.xlabel('Score')
plt.ylabel('Frequency')
plt.show()# 打印统计信息
print(f"Mean Score: {mean_score}")
print(f"Median Score: {median_score}")
print(f"Standard Deviation: {std_deviation}")

         在这个示例中,我们首先使用Pandas库加载CSV文件,然后提取其中的分数列并将其转换为NumPy数组。接下来,我们使用NumPy计算平均分、中位数和标准差。最后,我们使用Matplotlib库绘制了分数的直方图。

        这个示例展示了如何使用NumPy与其他库一起进行更复杂的数据分析任务,包括数据加载、计算统计信息和可视化数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序数据导出文件

小程序josn数据生成excel文件 先从下载传送门将xlsx.mini.min.js拷贝下来,新建xlsx.js文件放入小程序项目文件夹下。 const XLSX require(./xlsx)//在需要用的页面中引入// 定义导出 Excel 报表的方法exportData() {const that thislet newData [{time:2021,val…

用XSIBackup为VMware ESXi打造完美备份方案

文章目录 VMware ESXi 备份方案引言XSIBackup安装步骤1. XSIBackup软件安装2. SSH连接3. 定位到xsibackup目录4. 修改文件权限5. 安装cron查看crontab列表6. 配置备份任务结论VMware ESXi 备份方案 引言 数据就像是我们的生命线,一旦丢失,可能会带来无法挽回的损失。对于那…

AI绘画:StableDiffusion实操教程-斗罗大陆2-江楠楠-常服(附高清图下载)

前段时间我分享了StableDiffusion的非常完整的教程:“AI绘画:Stable Diffusion 终极宝典:从入门到精通 ” 尽管如此,还有读者反馈说,尽管已经成功安装,但生成的图片与我展示的结果相去甚远。真实感和质感之…

uniapp微信小程序用户隐私保护

使用wx.requirePrivacyAuthorize实现微信小程序用户隐私保护。 一、前言 微信小程序官方出了一个公告《关于小程序隐私保护指引设置的公告》。不整的话,后果很多授权无法使用,详见《小程序用户隐私保护指引内容介绍》 。 二、隐私相关设置 1、在 微信…

关于大模型参数微调的不同方法

Adapter Tuning 适配器模块(Adapter Moudle)可以生成一个紧凑且可扩展的模型;每个任务只需要添加少量可训练参数,并且可以在不重新访问之前任务的情况下添加新任务。原始网络的参数保持不变,实现了高度的参数共享 Pa…

CSS中如何隐藏元素但保留其占位空间(display:nonevsvisibility:hidden)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 隐藏元素但保留占位空间⭐ display: none;⭐ visibility: hidden;⭐ 总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

基于Django的博客管理系统

1、克隆仓库https://gitee.com/lylinux/DjangoBlog.git 若失效:https://gitee.com/usutdzxy/DjangoBlog.git 2、环境安装 pip install -Ur requirements.txt3、修改djangoblog/setting.py 修改数据库配置,其他的步骤就按照官方文档。 DATABASES {def…

dubbo服务管控

我们已经介绍了Dubbo在服务治理方面提供的特性,今天我们一起来看看Dubbo在其它方面提供的特性。同服务治理篇一样,本文的目的在于学会使用Dubbo在服务管控方面提供的特性,依旧不涉及任何实现原理。 工程结构 嗯~~ 是这样的,因为…

登录校验的相关知识点

登录校验的相关知识点 【1】会话技术1)会话:2)会话跟踪:3)常见的几种会话跟踪: 【2】JWT令牌1)定义解释2)测试生成Jwt令牌并解析3)注意事项 【3】过滤器Filter1)过滤器工作原理如下:2)简单使用示例3)自定义拦截路径4)疑问5)过滤器…

【Linux】简单的小程序:进度条

在学习进度条之前,需要学一点预备知识。 1. 预备知识 回车换行 现在的换行符(\n)其实就是回车式换行符,另起一行,光标指向最新一行的开头。回车符(\r)是光标指向这一行的开头。 缓冲区 &a…

VR全景对行业发展有什么帮助?VR全景制作需要注意什么?

引言: 虚拟现实(Virtual Reality,简称VR)早已不再是科幻电影的概念,而是在以惊人的速度改变着我们的世界。VR全景,作为其中的重要组成部分,正为多个行业带来了全新的机遇。 一、VR全景的应用领…

WebGL Varing变量的作用和内插过程,及执行Varing时涉及的图形装配、光栅化、颜色插值、片元着色器执行机制等详解

目录 前言 在 WebGL 或 OpenGL 中,“varying” 是一种用于在顶点着色器和片元着色器之间传递数据的特殊类型的变量。它允许在顶点着色器对数据进行处理后,在片元着色器中使用该处理后的数据进行进一步计算。 彩色三个点 ​编辑 彩色三个点示例代码…

大数据可视化大屏实战项目(4)物流数据云看台(包括动态登陆页面)—HTML+CSS+JS【源码在文末】(可用于比赛项目或者作业参考中)

大数据可视化大屏实战项目(4)物流数据云看台(包括动态登陆页面)—HTMLCSSJS【源码在文末】(可用于比赛项目或者作业参考中🐕🐕🐕) 一,项目概览 ☞☞☞☞☞☞…

【STM32】学习笔记(TIM定时器)

TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且…

Javase | IO流

目录: 1.输入 (Intput/Read)2.输出 (Output/Write)3.IO4.IO流5.IO流的分类:5.1 分类总述5.2 按照 “流的方向” 进行分类5.3 按照 “读取数据的方式” 进行分类 6.IO包下要重点掌握的流:6.1 文件专属 (流)6.2 转换流 ( 将字节流转换为字符流 …

2023.9 - java - 浅拷贝

与 js的浅拷贝不同: 在 JavaScript 中, Object.assign() 或 spread 运算符等方法可以实现浅拷贝,但只针对对象的第一层属性进行复制。如果一个对象只包含基本数据类型的属性,那么对浅拷贝出来的对象进行修改不会影响原始对象&…

C#安装“Windows 窗体应用(.NET Framework)”

目录 背景: 第一步: 第二步: 第三步: 总结: 背景: 如下图所示:在Visual Studio Installer创建新项目的时候,想要添加windows窗体应用程序,发现里面并没有找到Windows窗体应用(.NET Framework)模板,快捷搜索也没有发现&#…

22.3D等距社交媒体菜单的悬停特效

效果 源码 <!doctype html> <html><head><meta charset="utf-8"><title>CSS Isometric Social Media Menu</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.…

springboot web开发登录拦截器

在SpringBoot中我们可以使用HandlerInterceptorAdapter这个适配器来实现自己的拦截器。这样就可以拦截所有的请求并做相应的处理。 应用场景 日志记录&#xff0c;可以记录请求信息的日志&#xff0c;以便进行信息监控、信息统计等。权限检查&#xff1a;如登陆检测&#xff…

SQL sever中用户管理

目录 一、用户管理常见方法 二、用户管理方法示例 2.1. 创建登录账户&#xff1a; 2.1.1 检查是否创建账户成功&#xff1a; 2.2. 创建数据库用户&#xff1a; 2.2.1检查用户是否创建成功&#xff1a; 2.3. 授予权限&#xff1a; 2.3.1授予 SELECT、INSERT 和 U…