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

news/2025/2/27 1:47:23

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:矩阵的创建

python">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:数组的创建与组合

python">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:矩阵的运算

python">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:矩阵的转置、逆矩阵和二维数组视图

python">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:数组的基本运算

python">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:数组的比较运算

python">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:数组的逻辑运算

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

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

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

python">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:数组的广播相加(一维数组加到二维数组的不同维度)

python">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:数组的保存(单个数组)

python">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:数组的保存(多个数组)

python">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:数组的读取(单个数组和多个数组)

python"># 读取含有单个数组的文件
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:数组的保存和读取(文本格式)

python">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)

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

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

代码 2 - 44:数组的排序

python">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:返回排序后的索引

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

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

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

python">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:数组的去重

python">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)

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

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

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

python">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:数组的统计计算

python">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:数组的累计和与累计积

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

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


http://www.niftyadmin.cn/n/5869362.html

相关文章

【uniapp-Vue3】beforeRegister在注册用户入库前设置初始用户

关于uniCloud的beforeRegister钩子的具体介绍和用法在下面&#xff1a; uniCloudhttps://doc.dcloud.net.cn/uniCloud/uni-id/summary.html#before-register首先在uniCloud/cloudfunctions/common/uni-config-center/uni-id中创建hooks文件&#xff0c;再创建index.js文件 在…

CSS实现一张简易的贺卡

效果 当你把鼠标移至贺卡上时&#xff0c;贺卡会缓慢打开。 代码如下 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

前端监控与埋点

一、概念 前端埋点是指在网页或者应用程序中插入特定的代码&#xff0c;用于收集用户的行为数据并发送给服务器进行分析。这些数据可以包括用户的点击、浏览、输入等操作&#xff0c;帮助开发者了解用户在其网站中的行为&#xff0c;从而进行针对性的优化和改进。 前端埋点通…

tableau之网络图和弧线图

一、网络图 概念 网络图&#xff08;Network Graph&#xff09;&#xff0c;也称为网络可视化&#xff0c;是数据可视化的一种形式&#xff0c;用于显示实体&#xff08;节点&#xff09;之间的关系&#xff08;边&#xff09;。这种图表通过节点和边的结构揭示数据中的复杂关…

【愚公系列】《Python网络爬虫从入门到精通》034-DataFrame简单数据计算整理

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

C++ 跨平台的 GetCurrentThreadId() 获取当前线程ID实现

支持&#xff1a;C11 及早前标准库版本&#xff0c;而无需使用&#xff1a;std::this_thread::get_id()。 支持&#xff1a;NDK/ANDROID、Windows、Linux、MacOS X 等多个操作系统平台。 int64_t GetCurrentThreadId() noexcept { #if defined(_WIN32) || defined(_WIN64)retu…

C++复习专题——泛型编程(模版),包括模版的全特化和偏特化

1.泛型编程 在未接触模版前&#xff0c;如果我们想实现一个通用的交换函数&#xff0c;那么我们可以通过函数重载来实现 void Swap(int &x,int &y) {int z x;x y;y z; } void Swap(float &x,float &y) {int z x;x y;y z; } void Swap(double &x,dou…

全面容器监控:构建高效稳定的K8s监控体系

随着云计算的发展&#xff0c;Kubernetes&#xff08;简称K8s&#xff09;因其卓越的功能&#xff0c;已然成为部署及管理容器化工作的首选“容器编排平台”。同时&#xff0c;由于其架构的高复杂和高动态特性&#xff0c;对K8s的监控和运维工作提出了更高的要求。 北京智和信通…