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

【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与其他库一起进行更复杂的数据分析任务,包括数据加载、计算统计信息和可视化数据。

相关文章:

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

目录 1. 广播 2 文件输入和输出 3 随机数生成 4 线性代数操作 5 进阶操作 6 数据分析示例 1. 广播 广播是NumPy中的一种机制,用于在不同形状的数组之间执行元素级操作,使它们具有兼容的形状。广播允许你在不显式复制数据的情况下,对不同…...

druid连接不上doris有哪些可能原因

如果你在使用Druid连接池连接Doris时遇到问题,无法连接上数据库,可能有以下几个原因和解决方案: 网络配置问题:确保你的应用程序能够与Doris数据库所在的服务器进行通信。检查防火墙设置、网络配置以及Doris数据库的监听端口是否…...

双边滤波 Bilateral Filtering

本文是对图像去噪领域经典的双边滤波法的一个简要介绍与总结,论文链接如下: https://users.soe.ucsc.edu/~manduchi/Papers/ICCV98.pdf 1.前言引入 对一副原始灰度图像,我们将它建模为一张二维矩阵u,每个元素称为一个像素pixel&am…...

PXE批量装机

目录 前言 一、交互式 (一)、搭建环境 (二)、配置dhcp服务 (三)、FTP服务 (四)、配置TFTP服务 (五)、准备pxelinx.0文件、引导文件、内核文件 &#…...

Linux--VMware的安装和Centos

一、VMware和Linux的关系 二、VMware的安装 VM_ware桌面虚拟机 最新中文版 软件下载 (weizhen66.cn) VMware-Workstation-Lite-16.2.2-19200509-精简安装注册版.7z - 蓝奏云 如果安装不成功,则设置BIOS 三、在VMware中加入Centos 下载地址: CentOS-…...

dji uav建图导航系列()ROS中创建dji_sdk节点包(一)项目结构

文章目录 1、整体项目结构1.1、 目录launch1.2、文件CMakeLists.txt1.3、文件package.xml1.4、目录include1.4、目录srv在ROS框架下创建一个无人机的节点dji_sdk,实现必需的订阅(控制指令)、发布(无人机里程计)、服务(无人机起飞降落、控制权得很)功能,就能实现一个类似…...

基于x86_64 ubuntu22.04的framebuffer编程

文章目录 前言一、framebuffer简介二、framebuffer接口1.framebuffer设备描述信息2.framebuffer访问接口3.查询/设置可更改信息 三、使用步骤 前言 前段时间由于笔记本没有保管好,LCD显示屏压碎了。于是,将笔记本电脑拆开查看LCD型号。在淘宝上下单买了…...

解密回文--栈

“ xyzyx ”是一个回文字符串,所谓回文字符 串就是指正读反读均相同的字符序列,如“席主席”、“记书记”、“ aha ”和“ ahaha ”均是回 文,但“ ahah ”不是回文。通过栈这个数据结构我们将很容易判断一个字符串是否为回文。 首先我们需…...

Mysql主从服务安装配置

1.下载地址 MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ 2.安装配置 1.下载解压后,拷贝一份作为slave的安装目录 3.配置my.ini 由于下载mysql8版本,解压后,没有相关的my…...

双向BFS

1034 Number Game 分数 35 作者 陈越 单位 浙江大学 A number game is to start from a given number A, and to reach the destination number B by a sequence of operations. For the current number X, there are 3 types of operations: XX1 XX−1 XXN Your job is to f…...

数据艺术:精通数据可视化的关键步骤

数据可视化是将复杂数据转化为易于理解的图表和图形的过程,帮助我们发现趋势、关联和模式。同时数据可视化也是数字孪生的基础,本文小编带大家用最简单的话语为大家讲解怎么制作一个数据可视化大屏,接下来跟随小编的思路走起来~ 1.数据收集和…...

MySQL 是如何实现事务的四大特性的?

分析&回答 如果你不知道事务更不知道四大特性请先看看:说说什么是事务 原子性 语句要么都执行,要么都不执行,是事务最核心的特性,事务本身来说就是以原子性来定义的,实现主要是基于undo log undo log&#xff…...

python实现zscore归一化和minmax标准化

zscore归一化: minmax from sklearn import preprocessing from sklearn.preprocessing import StandardScaler import numpy as np# 数据 x np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]]) print(----------------minmaxscaler标准化-------------) # 调用minma…...

架构师成长之路Redis第三篇|Redis key过期清除策略

Eviction policies maxmemory 100mb 当我们设置的内存达到指定的内存量时,清除策略的配置方式决定了默认行为。Redis可以为可能导致使用更多内存的命令返回错误,也可以在每次添加新数据时清除一些旧数据以返回到指定的限制。 当达到最大内存限制时,Redis所遵循的确切行为是…...

C++智能指针之weak_ptr(保姆级教学)

目录 C智能指针之weak_ptr 概述 作用 本文涉及的所有程序 使用说明 weak_ptr的常规操作 lock(); use_count(); expired(); reset(); shared_ptr & weak_ptr 尺寸 智能指针结构框架 常见使用问题 shared_ptr多次引用同一数据,会导致两次释放同一内…...

ElementUI浅尝辄止18:Avatar 头像

用图标、图片或者字符的形式展示用户或事物信息。 常用于管理系统或web网站的用户头像&#xff0c;在用户账户模块更换头像操作也能看到关于Avatar组件的应用。 1.如何使用&#xff1f; 通过 shape 和 size 设置头像的形状和大小。 <template><el-row class"de…...

1688API技术解析,实现按图搜索1688商品(拍立淘)

一种可能的解决方案是使用图像识别和相似度匹配的算法。您可以通过将输入的图片与1688上的商品图片进行比对&#xff0c;找出最相似的商品。这涉及到图像特征提取、相似度计算以及数据库匹配等技术。您可以使用开源的图像处理库&#xff08;如OpenCV&#xff09;来进行图像处理…...

【面试经典150题】买卖股票的最佳时机

题目链接 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…...

selenium可以编写自动化测试脚本吗?

Selenium可以用于编写自动化测试脚本&#xff0c;它提供了许多工具和API&#xff0c;可以与浏览器交互&#xff0c;模拟用户操作&#xff0c;检查网页的各个方面。下面是一些步骤&#xff0c;可以帮助你编写Selenium自动化测试脚本。 1、安装Selenium库和浏览器驱动程序 首先…...

CXL.mem M2S Message 释义

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…...

使用boost::geometry::union_ 合并边界(内、外):方案二

使用boost::geometry::union_ 合并边界&#xff08;内、外&#xff09;&#xff1a;方案二 typedef boost::geometry::model::d2::point_xy<double> boost_point; typedef boost::geometry::model::polygon<boost_point> boost_Polygon;struct Point {float x;floa…...

ICCV 2023 | 小鹏汽车纽约石溪:局部上下文感知主动域自适应LADA

摘要 主动域自适应&#xff08;ADA&#xff09;通过查询少量选定的目标域样本的标签&#xff0c;以帮助模型从源域迁移到目标域。查询数据的局部上下文信息非常重要&#xff0c;特别是在域间差异较大的情况下&#xff0c;然而现有的ADA方法尚未充分探索这一点。在本文中&#…...

stable diffusion实践操作-黑白稿线稿上色

系列文章目录 本文专门开一节【黑白稿线稿上色】写相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 文章目录 系列文章目录前言一、操作步骤1. 找到黑白线稿图 总结 前言 本章主要介绍黑白稿线稿上色&#xff0c;这是通过Cont…...

Python学习教程:集合操作的详细教程

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 Python中有两种可以遍历的容器类型&#xff1a; 序列类型&#xff1a;包含字符串、列表、元祖 序列类型是线性表&#xff0c;就像数组一样&#xff0c;是在内存中开辟一块连续空间&#xff0c;连续存储的&#xff0c; 那么查找…...

球球的排列

题目传送门 引 计数DP,好像特别经典&#xff0c;有两种做法&#xff0c;我只会 O ( n 3 ) O(n^3) O(n3),有 O ( n 2 ) O(n^2) O(n2)的 解法 首先&#xff0c; 若 x y p 2 且 x z q 2 , 则 y z ( p q x ) 2 若xyp^2且xzq^2,则yz(\frac{pq}{x} )^2 若xyp2且xzq2,则yz(xpq…...

1783_CMD启动MATLAB同时执行一个脚本

全部学习汇总&#xff1a; GitHub - GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes…...

C语言中内存分配的几种方式

目录 C语言中内存分配的几种方式静态内存分配栈内存分配堆内存分配内存映射文件 C语言中内存分配的几种方式 静态内存分配 静态内存分配是在程序编译时分配内存&#xff0c;通常用于全局变量和静态变量。这些变量的内存空间在程序的整个运行期间都是存在的。 栈内存分配 栈内存…...

组相联cache如何快速实现cache line eviction并使用PMU events验证

如何快速实现cache line eviction 一&#xff0c;什么是cache hit、miss、linefill、evict &#xff1f;1.1 如果要程序员分别制造出cache hit、miss、linefill、evict这四种场景&#xff0c;该怎么做&#xff1f; 二&#xff0c;实现cache line eviction的方法1.1 直接填充法3…...

【Stable Diffusion安装】支持python3.11 window版

前言 主要的安装步骤是参考B站播放量第一的视频&#xff0c;但是那位阿婆主应该是没有编程经验&#xff0c;只强调使用3.10&#xff0c;而python最新版本是3.11。 理论上来说&#xff0c;只是一个小版本的不同&#xff0c;应该是可以安装成功了。自己摸索了下&#xff0c;挺费…...

Anycloud37D平台移植wirelesstools

0. 环境准备 下载 &#xff1a;https://www.linuxfromscratch.org/blfs/view/svn/basicnet/wireless_tools.html 1. 交叉编译wireless_tools tar xzf wireless_tools.29.tar.gz cd wireless_tools.29/打开Makefile&#xff0c;修改配置&#xff1a; ## Compiler to use (mo…...