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

news2024/11/25 20:53:45

目录

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 np

np.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 np

A = 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 np

A = 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 np

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

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

示例:

import numpy as np

A = 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 np

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

示例1:按值排序

import numpy as np

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

 示例2:按索引排序

import numpy as np

arr = 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 np

data = 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.coloradmin.cn/o/969933.html

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

相关文章

2022年09月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程(1~8级)全部真题・点这里 第1题:二叉树的深度 给定一棵二叉树,求该二叉树的深度 二叉树深度定义:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的…

读SQL学习指南(第3版)笔记10_元数据与大数据

1. 元数据 1.1. metadata 1.2. 关于数据的数据 1.3. 数据字典 1.3.1. ⒅与外键关联的数据表/列 1.3.2. ⒄外键列 1.3.3. ⒃外键名 1.3.4. ⒂存储索引的信息 1.3.5. ⒁索引列的排序(升序或降序) 1.3.6. ⒀已索引的列 1.3.7. ⑿索引类型&#xf…

CSDN的好处

社区交流:CSDN是一个广大的程序员社区,有很多技术大牛和优秀开发者,可以在这里进行技术交流和讨论,获取最新的技术动态和资源。 学习资源:CSDN上有很多高质量的技术文章、教程和视频资源,可以帮助程序员不…

2023-9-3 筛质数

题目链接&#xff1a;筛质数 埃氏筛法 #include <iostream>using namespace std;const int N 1000010;int cnt; bool st[N];bool get_primes(int n) {for(int i 2; i < n; i ){if(!st[i]){cnt ;for(int j i i; j < n; j i) st[j] true;}} }int main() {int …

linux深入理解多进程间通信

1.进程间通信 1.1 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件…

AUTOSAR规范与ECU软件开发(实践篇)7.11 MCAL配置验证与代码生成

在配置完所需MCAL模块之后&#xff0c; 就可以进行配置验证与代码生成。MCAL配置工具的工具栏如图7.64所示。 其中&#xff0c; 右起第二个按钮为“Verify selected project”&#xff0c; 点击之后将进行配置验证。 右起第一个按钮为“Generate Code for the currently select…

小小一个设置程序高级感拉满

手动设置 结果如下 代码设置&#xff1a; procedure TForm1.Button1Click(Sender: TObject); begin TStyleManager.TrySetStyle(cbxVclStyles.Text); end;procedure TForm1.FormCreate(Sender: TObject); var StyleName:string; begin for StyleName in TStyleManager.StyleNa…

查询优化器内核剖析之从一个实例看执行计划

学习查询优化器不是我们的目的&#xff0c;而是通过 它&#xff0c;我们掌握 SQL Server 是如何处理我们的 SQL 的&#xff0c;掌握执行计划&#xff0c;掌握为什么产生 I/O 问题&#xff0c; 为什么 CPU 使用老高&#xff0c;为什么你的索引加了不起作用... 如果&#xff0c;…

数学建模--整数规划匈牙利算法的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 #整数规划模型--匈牙利算法求解 """ 整数规划模型及概念&#xff1a;规划问题的数学模型一般由三个因素构成 决策变量 目标函数 约束条件&#xff1b;线性规划即以线性函数为目标函数&a…

Python开源项目月排行 2023年8月

#2023年8月2023年9月2日1facechain一款可以用于打造个人数字形象的深度学习模型工具。用户只需提供最低三张照片即可获得独属于自己的个人形象数字替身。FaceChain 支持在梯度的界面中使用模型训练和推理能力&#xff0c;也支持资深开发者使用 python 脚本进行训练推理。2Qwen-…

CXL寄存器介绍(3)- CXL MMIO

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

【SpringSecurity】六、基于数据库的认证与授权

文章目录 1、数据库表设计2、测试代码准备3、新建安全用户类4、实现UserDetailsService接口5、授权 1、数据库表设计 接下来基于数据库里的用户信息进行登录认证&#xff0c;以RBAC设计表&#xff0c;分别为&#xff1a; 用户表sys_user &#xff1a;除了基本信息外&#xff…

pytorch(b站小土堆学习笔记P1-P15)

P3. Python学习中的两大法宝函数&#xff08;当然也可以用在PyTorch&#xff09; import torch#查看pytorch有哪些指令 print(dir(torch)) print(dir(torch.cuda)) #查看每条指令怎么用 help(torch.cuda.is_available) P4. PyCharm及Jupyter使用及对比 P5 dataset和dataloade…

肖sir__设计测试用例方法之场景法04_(黑盒测试)

设计测试用例方法之场景法 1、场景法主要是针对测试场景类型的&#xff0c;顾也称场景流程分析法。 2、流程分析是将软件系统的某个流程看成路径&#xff0c;用路径分析的方法来设计测试用例。根据流程的顺序依次进行组合&#xff0c;使得流程的各个分支能走到。 举例说明&…

Pinely Round 2 (Div. 1 + Div. 2) F. Divide, XOR, and Conquer(区间dp)

题目 给定长为n(n<1e4)的数组&#xff0c;第i个数为ai(0<ai<2的60次方) 初始时&#xff0c;区间为[1,n]&#xff0c;也即l1&#xff0c;rn&#xff0c; 你可以在[l,r)中指定一个k&#xff0c;将区间分成左半边[l,k]、右半边[k1,r] 1. 如果左半边异或和与异或和的异…

肖sir__设计测试用例方法之判定表06_(黑盒测试)

设计测试用例方法之判定表 1、判定表&#xff1a;是一种表达逻辑判断的工具。 2、判定表&#xff1a;包含四部分 1&#xff09;条件桩&#xff08;condition stub&#xff09;:列出问题的 所有条件&#xff08;通常条件次序无关紧要&#xff09;。 2&#xff09;条件项&#x…

面试官:介绍一下CSS定位?absolute和relative分别依据什么定位?

能说服一个人的&#xff0c;从来不是道理&#xff0c;而是南墙。 一、position属性介绍 取值名称效果static静态定位(默认值)元素按照标准流布局 (不脱标) , top、bottom、left 、right等属性不起作用relative相对定位元素按照标准流布局 (不脱标) &#xff0c;可以通过top、b…

Medium:做AB test需要多少时间?

文章链接&#xff1a;https://medium.com/alfredcamera/%E5%81%9A-ab-test-%E9%9C%80%E8%A6%81%E5%A4%9A%E5%B0%91%E6%99%82%E9%96%93-c401fbe00eb0 其中&#xff0c;最关键的是确定&#xff1a;总共需要多少样本数量。由以下2个指标决定&#xff1a; 由工具得到&#xff1a; 特…

监听器Listener -,钝化,活化,利用监听器实现简易版 统计网站在线用户功能

监听绑定到HttpSession域中某个对象状态 1.HttpSessionBindingListener 实体类 package com.etime.enetity;import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener;//此处需要实现HttpSessionBindingListener接口&…

使用MDK5的一些偏僻使用方法和谋个功能的作用

程序下载后无法运行 需要勾选如下库&#xff0c;是优化后的库&#xff1b; MicroLib和标准C库之间的主要区别是: 1、MicroLib是专为深度嵌入式应用程序而设计的。 2、MicroLib经过优化&#xff0c;比使用ARM标准库使用更少的代码和数据内存。 3、MicroLib被设计成在没有操作…