数据分析三剑客之Numpy

news2025/1/20 18:26:28

数据分析三剑客:Numpy,Pandas,Matplotlib

1.简介

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

numpy是基于c语言开发,所以这使得numpy的运行速度很快,高效率运行就是numpy的一大优势。

首先·我们要导入numpy包,一般我们都把它命名为np:

In [1]: import numpy as np 

接着就可以生成一个numpy一维数组: 

In [2]: a = np.array([[1,2,3]],dtype=np.int32)
In [3]: a
Out[3]: array([1, 2, 3]) 

numpy中定义的最重要的数据结构是称为ndarray的n维数组类型,这个结构引用了两个对象,一块用于保存数据的存储区域和一个用于描述元素类型的dtype对象: 

2.WHY?

二维数组的生成在python中我们还可以用到list列表,如果用list来表示[1,2,3],由于list中的元素可以是任何对象,所以list中保存的是对象的指针,如果要保存[1,2,3]就需要三个指针和三个整数对象,是比较浪费内存资源cpu计算时间的,而ndarray是一种保存单一数据类型的多维数组结构,在数据处理上比list列表要快上很多,在这里我们可以用%timeit命令来检测两者的数据处理速度:

In [9]: a = range(1000)
In [10]: %timeit[i**2 for i in a]
381 µs ± 6.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [11]: b = np.arange(1000)
In [12]: %timeit b**2
1.41 µs ± 18 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 

由于相同数据大小的array运算直接作用到元素级上这一numpy特性,结果显而易见,在数据处理上numpy数组比使用for循环的list列表快的不是一点两点。 

3.常用操作

这里生成一个3×3的矩阵作为例子:

In [2]: data = np.array([[1,2,3],[4,5,6],[7,8,9]]) # 等价于data=np.arange(1,10).reshape(3,3)
In [3]: data
Out[3]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]]) 

查看矩阵信息:

In [6]: data.shape    # 返回元组,表示n行n列
Out[6]: (3, 3)

In [7]: data.dtype    # 返回数组数据类型
Out[7]: dtype('int32')

In [8]: data.ndim    # 返回是几维数组
Out[8]: 2 

转换数据类型:

In [11]: a = data.astype(float)    # 拷贝一份新的数组

In [12]: a.dtype
Out[12]: dtype('float64')

数组之间的计算:

In [15]: data+data
Out[15]:
array([[ 2,  4,  6],
       [ 8, 10, 12],
       [14, 16, 18]])

In [16]: data*data
Out[16]:
array([[ 1,  4,  9],
       [16, 25, 36],
       [49, 64, 81]])

可以看出相同规格的数组计算是直接作用在其元素级上的,那不同的规格的数组是否能进行运算呢,我们来看下这个例子:

In [18]: data1 = np.array([[1,2],[1,2]])    #生成一个2x2numpy数组

In [19]: data+data1
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-19-f2592a975589> in <module>()
----> 1 data+data1

ValueError: operands could not be broadcast together with shapes (3,3) (2,2)

我们可以看出不同规格的数组一起计算的话是会报出广播错误的,那是不是可以下结论了,别急我们再来看下方两个特殊例子:

In [20]: data2 = np.array([[1,2,3]])

In [21]: data + data2
Out[21]:
array([[ 2,  4,  6],
       [ 5,  7,  9],
       [ 8, 10, 12]])

In [22]: data3 = np.array([[1],[2],[3]])

In [23]: data+data3
Out[23]:
array([[ 2,  3,  4],
       [ 6,  7,  8],
       [10, 11, 12]])

data2数组的列数量与data数组相等,data3数组的行数量与data数组相等,这两个numpy数组虽然规格与data数组不一样,但却依然可以与data数组进行运算。

数组的切片:

In [24]: data[:2]    # 沿着行(axis=0)进行索引
Out[24]:
array([[1, 2, 3],
       [4, 5, 6]])

In [25]: data[:2,:2]    # 先沿着行(axis=0)进行索引,再沿着列(axis=1)进行索引
Out[25]:
array([[1, 2],
       [4, 5]])

In [26]: data[1,0:2]    # 下标是从0开始
Out[26]: array([4, 5])

这里需要注意的是,切片操作是在原始数组上创建一个视图view,这只是访问数组数据的一种方式。 因此原始数组不会被复制到内存中,传递的是一个类似引用的东西,与上面的astype()方法是两种不同的拷贝方式,这里我们来看一个例子:

In [32]: a = data[1]

In [33]: a
Out[33]: array([4, 5, 6])

In [34]: a[:] = 0

In [35]: data
Out[35]:
array([[1, 2, 3],
       [0, 0, 0],
       [7, 8, 9]])

当切片对象a改变时,data的对应值也会跟着改变,这是在我们日常数据处理中有时会疏忽的一个点,最安全的复制方法是使用

copy() 方法进行浅拷贝:

In [36]: a = data[1].copy()

In [37]: a
Out[37]: array([0, 0, 0])

In [38]: a[:]=9

In [39]: data
Out[39]:
array([[1, 2, 3],
       [0, 0, 0],
       [7, 8, 9]])

数组的布尔索引:

In [43]: data
Out[43]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [44]: data>3
Out[44]:
array([[False, False, False],
       [ True,  True,  True],
       [ True,  True,  True]])

In [45]: data[data>3]    # 找出大于3的元素
Out[45]: array([4, 5, 6, 7, 8, 9])

数组的逻辑表达处理:

In [46]: np.where(data>3,1,0)    # 大于3的标记为1,小于等于3的标记为0
Out[46]:
array([[0, 0, 0],
       [1, 1, 1],
       [1, 1, 1]])

数组的常用统计操作:

In [47]: data.mean(axis=0)    # 沿着行(axis=0)进行索引,求出其平均值
Out[47]: array([4., 5., 6.])
In [49]: data.std()    # 求出全部元素的方差
Out[49]: 2.581988897471611

In [50]: (data>3).sum()    # 统计数组中元素大于3的个数
Out[50]: 6

In [51]: data.any()    # 数组中是否存在一个或多个true
Out[51]: True

In [52]: data.all()    # 数组中是否全部数都是true
Out[52]: True
In [53]: data.cumsum(0)    # 沿着行(axis=0)进行索引,进行累加
Out[53]:
array([[ 1,  2,  3],
       [ 5,  7,  9],
       [12, 15, 18]], dtype=int32)

In [54]: data.cumprod(1)    # 沿着列(axis=1)进行索引,进行累乘
Out[54]:
array([[  1,   2,   6],
       [  4,  20, 120],
       [  7,  56, 504]], dtype=int32)

数组的排序操作:

In [55]: data=np.random.randn(4,4)

In [56]: data
Out[56]:
array([[ 1.58669867,  1.57692769, -1.85828013,  1.17201164],
       [ 1.68160714, -0.83957549, -0.33771694, -0.33782379],
       [-0.03148106, -0.97819034,  0.51126626, -0.08184963],
       [-0.02822319, -0.31934723,  0.70764701,  0.80444954]])

In [57]: data.sort(0)    # 沿着行(axis=0)进行索引,并进行升序排序

In [58]: data
Out[58]:
array([[-0.03148106, -0.97819034, -1.85828013, -0.33782379],
       [-0.02822319, -0.83957549, -0.33771694, -0.08184963],
       [ 1.58669867, -0.31934723,  0.51126626,  0.80444954],
       [ 1.68160714,  1.57692769,  0.70764701,  1.17201164]])

In [59]: data[::-1]    # 降序操作
Out[59]:
array([[ 1.68160714,  1.57692769,  0.70764701,  1.17201164],
       [ 1.58669867, -0.31934723,  0.51126626,  0.80444954],
       [-0.02822319, -0.83957549, -0.33771694, -0.08184963],
       [-0.03148106, -0.97819034, -1.85828013, -0.33782379]])

注意:直接调用数组的方法的排序将直接改变数组而不会产生新的拷贝。

矩阵运算:

In [62]: x=np.arange(9).reshape(3,3)

In [63]: x
Out[63]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [64]: np.dot(x,x)    # 矩阵相乘
Out[64]:
array([[ 15,  18,  21],
       [ 42,  54,  66],
       [ 69,  90, 111]])

In [65]: x.T    # 矩阵转置
Out[65]:
array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])

在numpy中的linalg中有还有很多矩阵运算,比如svd分解,qr分解,cholesky分解等等。

numpy数据的读取和保存:

In [68]: np.save('name',data)

In [69]: np.load('name.npy')
Out[69]:
array([[-0.03148106, -0.97819034, -1.85828013, -0.33782379],
       [-0.02822319, -0.83957549, -0.33771694, -0.08184963],
       [ 1.58669867, -0.31934723,  0.51126626,  0.80444954],
       [ 1.68160714,  1.57692769,  0.70764701,  1.17201164]])

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

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

相关文章

第二章 进程与线程 一、进程的概念、组成、特征

目录 一、进程的组成 ​编辑 二、概念 程序: 进程&#xff08; Process) : PID: 进程控制块&#xff08;PCB&#xff09;: 三、特征 1、动态性&#xff08;最基本的特性&#xff09; 2、并发性 3、独立性 4、异步性 5、结构性 一、进程的组成 二、概念 程序: 是静…

针对电子企业的数字工厂管理系统解决方案

随着科技的飞速发展和市场竞争的日益激烈&#xff0c;电子企业需要一种高效、智能的数字工厂管理系统解决方案&#xff0c;以提升生产效率、优化资源利用、降低运营成本&#xff0c;并确保高品质产品的输出。本文将详细探讨针对电子企业的数字工厂管理系统解决方案。 一、数字工…

页面静态化、Freemarker入门

页面静态化介绍 页面的访问量比较大时&#xff0c;就会对数据库造成了很大的访问压力&#xff0c;并且数据库中的数据变化频率并不高。 那需要通过什么方法为数据库减压并提高系统运行性能呢&#xff1f;答案就是页面静态化。页面静态化其实就是将原来的动态网页(例如通过ajax…

jmeter线程组 bzm - Arrivals Thread Group 阶梯式压测

简介 BZM - Arrivals Thread Group是jmeter的一个插件&#xff0c;它可以模拟并发到达的用户流量、按时间加压&#xff0c;可以有效地帮助测试人员评估系统在高压力和高并发情况下的性能表现。 插件下载地址&#xff08;jmeter版本不低于 5.2.0 &#xff09;&#xff1a;https:…

开课吧(三)机器人系统(ros详解)

目录 常用快捷键&#xff1a; 常用命令&#xff1a; Catkin编译系统&#xff1a; 简析.XML文件&#xff08;说明书&#xff09; name指package名字 version指版本 description指描述 maintainer指拥有者 license指授权 buildtool_depend 依赖catkin编译 build_depend指依…

【C++】day6学习成果:继承、多态、栈和循环队列

1.将之前定义的栈类和队列类都实现成模板类 栈&#xff1a; #include <iostream>#define MAX 8using namespace std;template<typename T> class Stack { private:T *data; //栈的数组&#xff0c;指向堆区空间&#xff0c;用于存储栈的容器int top; …

基于元素小组的归并排序算法

问题说明 什么是针对元素小组的归并排序算法&#xff0c;举个例子&#xff1a;假如有一个数组[1,2,3,4,5,6,7,8,9]&#xff0c;{1,2,3}为一个小组&#xff0c;{4,5,6}为一个小组&#xff0c;{7,8,9}为一个小组&#xff0c;现需要根据每个小组的第一个元素来进行排序&#xff0…

upload-labs文件上传靶场实操

文章目录 1.Pass-012.Pass-023.Pass-034.Pass-045.Pass-056.Pass-067.Pass-078.Pass-089.Pass-0910.Pass-1011.Pass-1112.Pass-1213.Pass-1314.Pass-1415.Pass-1516.Pass-16 1.Pass-01 改后缀名绕过 只能上传图片&#xff0c;先上传一个jpg格式的图片&#xff0c;然后抓包改格…

如何在 Excel 中进行加,减,乘,除

在本教程中&#xff0c;我们将执行基本的算术运算&#xff0c;即加法&#xff0c;减法&#xff0c;除法和乘法。 下表显示了我们将使用的数据以及预期的结果。 | **S / N** | **算术运算符** | **第一个号码** | **第二个号码** | **结果** | | 1 | 加法&#xff08;&#xff…

企业形象片宣传片策划要从哪里展开

企业形象片宣传片是一种有效的营销工具&#xff0c;能够向潜在客户传达企业的核心价值观、品牌形象和产品服务。对于企业来说&#xff0c;一个成功的宣传片可以增加品牌知名度&#xff0c;提高销售额&#xff0c;并建立与客户的良好关系。然而&#xff0c;要想策划一部成功的企…

org.apache.hadoop.hbase.PleaseHoldException: Master is initializing

背景 CDH集群切换数据盘&#xff0c;导致服务无法启动&#xff0c;卸载重装了 hbase、hdfs、yarn、oozie、spark等服务&#xff0c;未卸载重装的zookeeper、kafka。 重装hbase后无法创建表。 报错 hbase(main):001:0> create test,cf1 ERROR: org.apache.hadoop.hbase.Pl…

【计算机网络】传输层协议——TCP(上)

文章目录 TCPTCP协议段格式报头和有效载荷如何分离&#xff1f;4位首部长度 TCP可靠性确认应答机制的提出序号和确认序号为什么序号和确认序号在不同的字段&#xff1f; 16位窗口大小 6个标志位标志位本质具体标志位PSHRSTURG 超时重传机制 文章目录 TCPTCP协议段格式报头和有效…

SAP SD之定义装运点OVL2

什么是装运点&#xff1f; 装运点是一个独立的组织实体&#xff0c;其中进行货物的发行和交付处理。 可以为每个订单商品确定一个装运点。 确定装运点取决于以下三个因素&#xff1a; 客户主记录中的运输条款和条件&#xff08;运输屏幕&#xff09;。 例如&#xff0c;公司与…

为什么选择C/C++内存检测工具AddressSanitizer?如何使用AddressSanitizer?

目录 1、C程序中的内存问题 2、AddressSanitizer是什么&#xff1f; 3、AddressSanitizer内存检测原理简述 3.1、内存映射 3.2、插桩 4、为什么选择AddressSanitizer&#xff1f; 4.1、Valgrind介绍 4.2、AddressSanitizer在速度和内存方面为什么明显优于Valgrind 4.3…

安卓最强LSPosed框架v1.9.1正式版下载-API变更-支持安卓14新系统+刷入教程

LSPosed框架自1.86以后比较稳定&#xff0c;LSPosed官方更新的也变慢了很多&#xff0c;上周开始LSP框架又开始了大版本更新&#xff0c;直接迭代到V19.1版本。单从更新日志上来看&#xff0c;这两次的更新幅度比较大&#xff0c;也修复了很多我们常见的问题。从我们正常刷入体…

C语言——字符函数和字符串函数_学习笔记

本文目录 一、字符函数1.1 字符分类函数常见的字符分类函数介绍应用举例 1.2 字符转换函数函数介绍toupper 函数举例 二、字符串函数2.1 常用的字符串函数介绍2.2 应用举例① strlen② strcpy③ strcat④ strcmp⑤ strncpy⑥ strncat⑦ strncmp⑧ strstr⑨ strtok 关于一些字符…

【新版vscode配置自动补全括号】

vscode新版配置自动补全括号方法 新版配置方法(Pylance) ①设置 -> 扩展 -> Pylance -> 将 python.analysis.completeFunctionParens 下方的选项打勾 ②直接在settings.json中添加"python.analysis.completeFunctionParens": true

书单背景图和视频制作方法分享

如今&#xff0c;在社交媒体上发布一张书单背景图或宣传视频已成为推广阅读和书籍的流行方式。这些视觉内容能够吸引读者的眼球并提供一些简单易懂的信息&#xff0c;如书名、作者、简介等。下面是一些简单的方法&#xff0c;可以帮助你创建出与众不同的书单背景图和视频。 创意…

kubernetes安全检测工具-kube-bench

一、kube-bench基础介绍 kube-bench是基于go语言开发、一款针对kubernetes进行安全检测的工具&#xff0c;主要是检测kubernetes集群的各个组件的配置&#xff0c;确认配置文件是否符合安全基线标准&#xff0c;输出检测报告&#xff0c;并给出修复建议&#xff0c;从而使kuber…

Jetson nano嵌入式平台配置ip记录

背景 Jetson nano平台使用千兆网和PC连接时没有ip地址&#xff0c;在ubuntu的终端输入ifconfig显示eh0未设置ip&#xff0c;需要先在nano平台上配置ip地址&#xff0c;然后PC通过千兆网远程控制该平台。 配置ip 使用终端进入到network文件夹中&#xff0c; cd /etc/network…