数据分析 | NumPy

NumPy,全称是 Numerical Python,它是目前 Python 数值计算中最重要的基础模块。NumPy 是针对多维数组的一个科学计算模块,这个模块封装了很多数组类型的常用操作。

使用numpy来创建数组

import numpy as npdata = np.array([1, 2, 3])
print(data)
# 输出:[1 2 3]
print(type(data))
# 输出:<class 'numpy.ndarray'>

除了使用 np.array() 方法来创建一个多维数组,numpy 还提供了两个实用的方法——np.ones() 和 np.zeros(),分别生成元素全为 1 和 0 的多维数组。

ones = np.ones(3)
print(ones)
# 输出:[1. 1. 1.]zeros = np.zeros(3)
print(zeros)
# 输出:[0. 0. 0.]
  • np.ones() 和 np.zeros() 的参数用于指定生成的多维数组里有多少个元素。
  • 并且生成出来的不是 1 和 0,而是 1. 和 0.。这是因为默认生成的是浮点数,numpy 会省略小数点后的 0,因此 1.0 和 0.0 变成了 1. 和 0.。

如果想要生成整数的话,可以传入 dtype 参数来指定类型:

ones = np.ones(3, dtype='int')
print(ones)
# 输出:[1 1 1]
zeros = np.zeros(3, dtype='int')
print(zeros)
# 输出:[0 0 0]

数组的加减乘除:

列表间只有加法操作,作用是将两个列表的元素合并在一起。而多维数组间可以进行加减乘除的四则运算,运算规则也很简单:将两个数组中对应位置的元素一一进行运算。

两个多维数组的形状必须一致才能进行四则运算

data = np.array([1, 2])
ones = np.ones(2)
print(data + ones)
# 输出:[2. 3.]

除了多维数组间的四则运算,多维数组直接和数字进行计算的方式也很常用

data = np.array([1, 2])
print(data + 1)
# 输出:[2 3]

上述效果用列表来实现也是可以的

data = []
for i in [1, 2]:data.append(i + 1)
print(data)
# 输出:[2, 3]

用列表就必须用到循环,而 numpy 中这种不用编写循环就可以对数据进行批量运算的方式叫做 矢量化。numpy 中的矢量化操作把内部循环委托给高度优化的 C 和 Fortran 函数,从而实现更清晰,更快速的 Python 代码。

多维数组:

一维数组只有行,二维数组相比一维数组多了列这个维度,而三维数组则类似多个二维数组堆叠在一起,形如一个立方体。

将单层嵌套列表传入 np.array() 方法创建一个二维数组:

# 单层嵌套列表
nested_list = [[1, 2], [3, 4]]
print(nested_list)
# 输出:[[1, 2], [3, 4]]# 二维数组
data = np.array(nested_list)
print(data)
# 输出:
# [[1 2]
#  [3 4]]

通过嵌套列表创建的二维数组也是用空格分隔的,并且分成了两行。列表中的第一个元素 [1, 2] 在第一行,第二个元素 [3, 4] 在第二行。

 ones() 和 zeros() 方法同样也能快速创建元素全为 1 和 0 的二维数组。

创建二维数组要传入一个包含行和列信息的元组。比如:np.ones((m, n)) 表示创建一个 m 行 n 列且元素全为 1 的二维数组。

ones = np.ones((3, 2))
print(ones)
# 输出:
# [[1. 1.]
#  [1. 1.]
#  [1. 1.]]zeros = np.zeros((3, 2))
print(zeros)
# 输出:
# [[0. 0.]
#  [0. 0.]
#  [0. 0.]]

多维数组的属性:

  • ndim:多维数组维度的个数。例如:二维数组的 ndim 为 2;
  • shape:多维数组的形状。它是一个元组,每个元素分别表示每个维度中数组的长度。对于 m 行和 n 列的的数组,它的 shape 将是 (m, n)。因此,shape 元组的长度(元素个数)就是 ndim 的值;
  • size:多维数组中所有元素的个数。shape 元组中每个元素的乘积就是 size 的值;
  • dtype:多维数组中元素的类型。
data = np.array([[1, 2, 3], [4, 5, 6]])print('ndim:', data.ndim)
print('shape:', data.shape)
print('size:', data.size)
print('dtype:', data.dtype)
# 输出:
# ndim: 2
# shape: (2, 3)
# size: 6
# dtype: int64

int64 是 numpy 提供的类型,表示 64 位的整数。

二维数组的通用方法:

通过 axis 参数可以指定计算方向

data = np.array([[1, 2], [5, 3], [4, 6]])# 不指定 axis
print(data.max())
# 输出:6# axis=0
print(data.max(axis=0))
# 输出:[5 6]# axis=1
print(data.max(axis=1))
# 输出:[2 5 6]

二维数组的索引和分片:

  • 二维数组的索引和分片同样和一维数组类似,只是在行索引的基础上再加上列索引。形如 data[m, n],其中 data 是二维数组,m 是行索引或分片,n 是列索引或分片。
  • 那么,data[0, 1] 就表示获取 data 中第一行第二列的元素。如果省略第二个参数 n 的话表示获取所有列,data[0] 就表示获取整个第一行,相当于 data[0, :]
  • 如果想要获取第一列则可以写成 data[:,0];如果想获取 2、3 两行可以写成 data[1:3],相当于 data[1:3, :]
data = np.array([[1, 2], [3, 4], [5, 6]])print(data[0, 1])
# 输出:2print(data[:, 0])
# 输出:[1 3 5]print(data[1:3])
# 输出:
# [[3 4]
#  [5 6]]

numpy 中的高级索引:

布尔索引 :
data = np.array([[1, 2], [3, 4], [5, 6]])
print(data > 3)
#输出:[[False False]
#     [False  True]
#    [ True  True]]
print(data[data>3])
#输出:[4 5 6]
# 大于 3 并且小于 5
print(data[(data>3) & (data<5)])
#输出:[4]
# 大于 3 或者小于 2
print(data[(data > 3) | (data < 2)])
# 输出:[1 4 5 6]
# 大于 3 或者不小于 2(即大于等于 2)
print(data[(data > 3) | ~(data < 2)])
# 输出:[2 3 4 5 6]
# 等于 3
print(data[data == 3])
# 输出:[3]
# 不等于 3
print(data[data != 3])
# 输出:[1 2 4 5 6]

and 改用 &or 改用 |not 改用 ~,并且每个条件要用括号括起来。

实用方法:

arange() 方法:

numpy 中的 arange() 方法和 Python 中的 range() 用法类似,不同之处在于 arange() 方法生成的是数组,而 range() 方法生成的是 range 类型的序列。

# 生成 1-9 的数组
print(np.arange(1, 10))
# 输出:[1 2 3 4 5 6 7 8 9]# 生成 0-9 的数组
print(np.arange(10))
# 输出:[0 1 2 3 4 5 6 7 8 9]# 生成 1-9 的数组,步长为 2
print(np.arange(1, 10, 2))
# 输出:[1 3 5 7 9]
随机方法:

numpy 中的 np.random.rand() 方法和 Python 中 random.random() 方法类似,都是生成 [0, 1) 之间的随机小数。不同的是,numpy 中的 np.random.rand() 方法可以生成多个 [0, 1) 之间的随机小数,只需我们传入要生成的随机数组的形状(shape)即可。

# 不传参数时
print(np.random.rand())
# 输出:0.1392571183916036# 传入一个参数时
print(np.random.rand(3))
# 输出:[0.7987698  0.52115291 0.70452156]# 传入多个参数时
print(np.random.rand(2, 3))
# 输出:
# [[0.08539006 0.97878203 0.23976172]
#  [0.34301963 0.48388704 0.63304024]]

numpy 中的 np.random.randint() 方法和 Python 中的 random.randint() 类似,

不同之处在于,random.randint(m, n) 生成的是 [m, n] 之间的整数,

而 np.random.randint(m, n) 生成的是 [m, n) 之间的整数。

# 不传入形状时
print(np.random.randint(0, 5))
# 输出:3# 形状为一维数组时
print(np.random.randint(0, 5, 3))
# 输出:[4 0 1]# 形状为二维数组时
print(np.random.randint(0, 5, (2, 3)))
# 输出:
# [[0 2 1]
#  [4 2 0]]
genfromtxt() 方法:

genfromtxt() 方法用于文件的读取。

genfromtxt() 方法常用的参数有两个,分别是数据源和分隔符。假设我们要用 numpy 读取一个以逗号分隔的 CSV 文件,可以这样写:

data = np.genfromtxt('data.csv', delimiter=',')

第一个参数是数据源,可以是本地文件的路径,也可以是网络文件的地址。delimiter 参数用于指定分隔符,CSV 文件一般是用逗号作为分隔符,当遇到其他符号分隔的文件时,用 delimiter 参数进行指定即可。

genfromtxt() 方法的返回值是一个多维数组。


索引:

numpy 中多维数组的索引也是从 0 开始,以多维数组的长度减 1 结束,可以直接使用 data[-1] 获取数组中的最后一个元素。写法也和列表索引一样:

data = np.array([1, 2, 3])
print(data[0])
# 输出:1
print(data[-1])
# 输出:3

分片:

多维数组的分片和列表的分片也是基本类似的,形如 data[m:n]。分片是左闭右开区间,即包含 m 不包含 n,也就是获取索引为 m 到 n-1 之间的元素(包含 m 和 n-1)。

data = np.array([1, 2, 3])
print(data[0:2])  # 获取索引为 0 和 1 的元素
# 输出:[1 2]

多维数组也同样支持反向索引分片,使用 data[-3:-1] 也同样能得到 [1 2]

在列表分片时,冒号前后的值是可以省略的。省略后冒号前默认为 0,冒号后默认为列表的长度。这同样适用于多维数组,所以通过冒号前后值的省略,有如下分片小技巧:

data = np.array([1, 2, 3])
# 获取前 2 个元素
print(data[:2])
# 输出:[1 2]# 获取后 2 个元素
print(data[-2:])
# 输出:[2 3]# 获取所有元素
print(data[:])
# 输出:[1 2 3]

注意:列表分片是将分片后的数据复制了一份,而多维数组的分片则是返回原数据其中的一块,并没有复制数据。

因此,对列表分片后的数据进行更改不会影响原数据,但对多维数组分片后的数据进行更改会影响到原数据。

# 列表
lst_data = [1, 2, 3]
lst_data2 = lst_data[:]
lst_data2[0] = 6
print(lst_data)
# 输出:[1, 2, 3]# 多维数组
arr_data = np.array([1, 2, 3])
arr_data2 = arr_data[:]
arr_data2[0] = 6
print(arr_data)
# 输出:[6 2 3]

numpy 设计的目的是处理大数据,所以,numpy 中的切片默认不会复制一份副本,而是返回原数据中的一块,被称为视图(View)。如果想要得到一份副本,则需要手动调用 copy() 方法进行复制,例如:arr_data[:].copy()

分片支持传入第三个参数——步长(分片时每隔几个数据取一次值,步长的默认值为 1)

data = np.array([1, 2, 3, 4, 5, 6])
print(data[::2])  # 省略前两个参数
# 输出:[1 3 5]

上述例子中省略了前两个参数,默认为 0 和 6,步长为 2。所以 data[::2] 等价于 data[0:6:2],作用是索引在 0 到 5 之间的元素,且索引每次加 2。最终将得到索引为 0、2、4 的元素,结果为 [1 3 5]

当步长为负数时,会将顺序反转。

data = np.array([1, 2, 3, 4, 5, 6])
print(data[::-1])  # 省略前两个参数
# 输出:[6 5 4 3 2 1]

可以利用这个特性来实现列表或多维数组的快速反转。

numpy的方法

求平均值的 mean() 方法,最大值的 max() 方法、求最小值的 min() 方法、求和的 sum() 方法

求中位数的median()方法,求极差的ptp()方法,求标准差的std()方法,求方差的var()方法

import numpy as npdata = np.array([4, 2, 3, 7])
print(np.mean(data))
#输出:4.0
print(np.median(data))
#输出:3.5
print(np.min(data))
#输出:2
print(np.max(data))
#输出:7
print(np.ptp(data))
#输出:5
print(np.std(data))
#输出:1.8708286933869707
print(np.var(data))
#输出:3.5
  • 离中趋势是指一组数据中各数据值以不同程度的距离偏离其中心(平均数)的趋势。其常用指标有 极差方差 和标准差
  • 极差是一组数据的最大值减去最小值得到的,反应了数据变动的最大范围。
  • 方差的计算方式是:将一组数据中的每个数减去这组数据的平均数,然后将得到的结果进行平方求和,最后再除以数据的个数。
  • 标准差是方差的平方根。
  • 方差和标准差都能反映数据的离散程度,也就是数据的波动程度。方差和标准差的值越小,说明数据越稳定。

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

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

相关文章

网络学习:邻居发现协议NDP

目录 前言&#xff1a; 一、报文内容 二、地址解析----NS/NA 目标的被请求组播IP地址 邻居不可达性检测&#xff1a; 重复地址检测 路由器发现 地址自动配置 默认路由器优先级和路由信息发现 重定向 前言&#xff1a; 邻居发现协议NDP&#xff08;Neighbor Discovery…

Linux mount命令教程:如何挂载和管理文件系统(附实例详解和注意事项)

Linux mount命令介绍 mount命令用于将设备上找到的文件系统挂载到以/为根的大树结构&#xff08;Linux文件系统&#xff09;。相反&#xff0c;另一个命令umount可以用来将这些设备从树中分离。 Linux mount命令适用的Linux版本 mount命令在所有主流的Linux发行版中都是可用…

【晴问算法】入门篇—贪心算法—区间不相交问题

题目描述 给定n个开区间&#xff0c;从中选择尽可能多的开区间&#xff0c;使得这些开区间两两没有交集。 输入描述 输出描述 输出一个整数&#xff0c;表示最多选择的开区间个数。 样例1输入 4 1 3 2 4 3 5 6 7 输出 3 解释 最多选择(1,3)、(3,5)、(6,7)三个区间&#xff0c;它…

CSS中水平垂直居中的实现

利用绝对定位&#xff0c;先将元素的左上角通过top:50%和left:50%定位到页面的中心&#xff0c;然后再通过translate来调整元素的中心点到页面的中心。该方法需要考虑浏览器兼容问题。 .parent { position: relative; } .child { position: absolute; left: 50%; …

SAP前台处理:销售业务集成<VA03/VL03N/VLPOD/VF03) 01/02

一、背景&#xff1a; 从销售订单创建VA01>发货过账VL01N >POD确认>VF01开票 这个流程涉及的凭证流及各个节点如何查询上游下游凭证&#xff1b; 二、凭证流&#xff1a; 从销售订单查看销售凭证流 VA03 双击交货单&#xff1a;带出交货单对应行项目及分批次项目…

SpringBoot(文件上传功能,阿里云OSS存储,几种配置文件用法)【详解】

目录 一、新增员工 二、文件上传-技术点 1. 文件上传功能 1.客户端上传文件三要素 2 服务端接收文件 Controller接收文件示例 修改允许上传的文件大小 2. 本地存储文件 3. 阿里云OSS存储&#xff08;这里只写一种&#xff0c;可以用其它的&#xff09; 1.介绍 2.开通…

c# .net6 Task 多线程介绍

c# .net6 Task 多线程介绍 一、Task 启动方式 1. new Task() 直接new Task对象&#xff0c;传入Action委托&#xff0c;该方法不具有参数且不返回值&#xff0c;然后调用Start()即可。 Task task new Task(() >{Console.WriteLine($"01:这里开启了一个线程&#xf…

24计算机考研调剂 | 武汉科技大学

武汉科技大学冶金新技术与功能金属材料研究梯队招收研究生 考研调剂招生信息 学校:武汉科技大学 专业: 工学->治金工程 工学->材料科学与工程 工学->计算机科学与技术 工学->动力工程及工程热物理 工学->机械工程 年级:2024 招生人数:20 招生状态:正在招…

【前端】CSS常见的选择器

CSS&#xff08;层叠样式表&#xff09;提供了多种选择器&#xff0c;用于选择要应用样式的 HTML 元素。在CSS中选择器是一种模式&#xff0c;用于匹配HTML文档中的某些元素并且应用到这些元素上。我们可以通过选择器给特定的元素设置样式。 常见的 CSS 选择器 元素选择器&am…

try~catch语句

用try~catch语句来处理异常&#xff0c;将可能出现的异常操作放在 try部分&#xff0c;将发生异常后的处理放在catch部分。 带finally子语句的try~catch 语法格式 执行机制 ★注意★&#xff1a; try~catch中执行了return → finally子语句仍被执行&#xff1b; try~catch中执…

VScode(8)之阅读大型CC++工程

VScode(8)之阅读大型CC工程(Linux内核)代码 Author&#xff1a;Once Day Date&#xff1a;2023年4月25日/2024年3月17日 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: VScode开发_Once-Day的博客-CSDN博客 参考文档: 1. 历史包袱 由于上世纪70-80年代的…

【亲测可行】Mac上clion boost库的安装与使用

很多博客上关于boost库的安装与使用都有问题&#xff0c;所以自己写一篇文章来纠正一些错误 这里采用homebrew安装 brew install boost安装好以后boost目录在 /opt/homebrew/Cellar/boost/xxx版本 下&#xff0c;然后可以看到lib&#xff08;库文件&#xff09;和include&…

语音神经科学—04.Speech Computations of the Human Superior Temporal Gyrus

Speech Computations of the Human Superior Temporal Gyrus&#xff08;人类颞上沟的言语计算&#xff09; 专业术语 Superior Temporal Gyrus 颞上沟 phoneme 音素 syllable 音节 speech perception 语音感知 vocal tract 声道 acoustic 声学的 articulatory 发音的 spectro…

【基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸设计】

1.前言 基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸 在当今物联网与智能家居科技日益发达的时代&#xff0c;将先进技术和传统养鱼艺术融合&#xff0c;创造出智能、自动化且极具观赏价值的鱼缸已成为一种创新趋势。SeeedStudio推出的Xiao ESP32-S3 Sense开发板以其卓越的性能…

command failed: npm install --loglevel error --legacy-peer-deps

在使用vue create xxx创建vue3项目的时候报错。 解决方法&#xff0c;之前使用的https://registry.npm.taobao.org 证书过期更换镜像地址即可 操作如下&#xff1a; 1.cd &#xff5e;2.执行rm .npmrc3. sudo npm install -g cnpm --registryhttp://registry.npmmirror.com…

建立人才信息化管理体系,提高企业核心竞争力

很多企业在发展中&#xff0c;都引入了信息化工具系统来提升管理效率。在人力资源管理方面&#xff0c;也有不少信息化系统。通过大量调研发现&#xff0c;在人才管理的初级阶段&#xff0c;企业通过对员工数量统计、员工结构统计、入离职、人才梯队数据、招聘管理数据、培训管…

基于高斯模型的运动目标检测(车辆检测),Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

Vue3:标签的ref属性用法

一、情景说明 我们在写前端页面的时候&#xff0c;肯定会遇到获取DOM内容的情况。 以往&#xff0c;我们是用原生的js方法去获取&#xff0c;如document.getXxxx 但是&#xff0c;这中方法会有个问题&#xff0c;如果父组件和子组件的id相同&#xff0c;则会出错。 在Vue3中&…

ASP.NET 服务器控件

目录 一、使用的软件 1、下载 2、新建文件&#xff08;写一个简单的web网页&#xff09; 二、相关知识点 1、Web窗体网页的组件 &#xff08;1&#xff09;可视化组件 &#xff08;2&#xff09;用户接口逻辑 2、Web Form网页的代码模型 &#xff08;1&#xff09;单文件…

Typecho博客网站底部添加网站已运行时间教程

样式一&#xff1a; 1. 将代码放入 functions.php 一般在主题根目录&#xff1a;网站 /usr/themes/ 主题 修改一下你自己的网站时间 // 设置时区date_default_timezone_set(Asia/Shanghai);/*** 秒转时间&#xff0c;格式 年 月 日 时 分 秒**/function getBuildTime() {// …