【Python】NumPy(二):数组运算、数据统计及切片索引、广播机制

目录

Numpy数组

数组的基本运算

乘法

加法

数组的数据统计

平均值

中位数

最大值和最小值

求和

累积和

标准差

 方差

切片和索引

索引

一维数组的索引

二维数组的索引

获取多个元素

 布尔索引

切片

一维数组切片

二维数组切片

多维数组切片

广播机制

规则

理解


在上一篇中,了解了NumPy中的数组创建以及基础操作。那么本篇我们就来讲解一下数组的简单运算以及其中的数据统计。

Numpy数组

数组的基本运算

在python中,如果我们要两个数组相加/乘/减/除,那么我们需要利用循环来进行,但是在NumPy中,我们可以直接相乘等。

(注意哦,记得提前导包)

乘法

# 将两个数组相乘
a = np.array([1,2,3,4])
b = np.array([5,6,7,8])
c = a*b
c
array([ 5, 12, 21, 32])

加法

# 将两个数组相加
a = np.array([1,2,3,4])
b = np.array([5,6,7,8])
c = a+b
c
array([ 6,  8, 10, 12])

其他的类似。

# 给数组开平方 
a = np.array([1,2,3,4])
a = a**2
a
array([ 1,  4,  9, 16])

数组的数据统计

这个相对比较简单,用多了就会。

平均值

numpy.mean(arr,axis=None,dtype=None,out=None)

  • arr:所要计算平均值的数组;
  • axis:沿着哪个方向进行计算平均值(0为竖直,1为水平,默认全部计算);
  • dtype:返回结果的数据类型;
  • out:将结果存储在指定数组中。 

示例:

# 现有一个二维数组,计算每一行的平均值
a = np.array([[1,2,3,4,5,6,7,8,9],[3,5,7,4,11,12,4,6,7]
])
b = np.mean(a,axis=1)
b
array([5.        , 6.55555556])

中位数

numpy.median(arr,axis=None,out=None)

参数的意思跟平均值中的参数含义相同。

示例:

# 求数组的中位数
a = [1,2,4,5,6,7]
b = np.median(a)
b
4.5

最大值和最小值

numpy.max(arr,axis=None,out=None)

numpy.min(arr,axis=None,out=None)

参数含义和平均值的参数一样。

# 求数组中的最小值和最大值
a = np.array([[12,34,5,23,4,3],[1,2,4,5,6,5]
])
b = np.max(a)
c = np.min(a)
b,c
(34, 1)

求和

numpy.sum(arr,axis=None,out=None)

# 求数组元素之和
a = np.array([[12,34,5,23,4,3],[1,2,4,5,6,5]
])
sum = np.sum(a)
sum
104

累积和

numpy.cumsum(arr,axis=None,dtype=None,out=None)

参数意思和mean()的参数一样。

# 求数组累积和
a = np.array([[12,34,5,23,4,3],[1,2,4,5,6,5]
])
sum = np.cumsum(a)
sum
array([ 12,  46,  51,  74,  78,  81,  82,  84,  88,  93,  99, 104])

标准差

numpy.std(arr,axis=None,dtype=None,out=None)

 方差

numpy.var(arr,axis=None,out=None)

示例:

# 计算数组的方差,标准差
a = np.array([4,7,3,9,6,10])
b = np.std(a)
c = np.var(a)
b,c
(2.5, 6.25)

切片和索引

索引

索引,在NumPy中,简单来说就是下标,利用索引来访问和修改特定元素。

一维数组的索引

# 给定一个一维数组
a = np.array([1,2,3,4,5])
# 访问其中的第三个元素(下标从0开始)
print(a[2])
3

二维数组的索引

# 给定一个二维数组
a = np.array([[1,2,3,4,5],[6,7,8,9,10]
])
# 访问其中在第二行第3列个元素 [][]:第一个括号是行索引,第二个括号是列索引。
print(a[1][2])
8

获取多个元素

如果我们想一次获取数组中多个特定的元素,那么我们可以采用逗号隔开;

a[[1,3],[1,1]]  :中第一个列表[1,3]表示的是行索引,第二个列表中的[1,1]表示的是列索引。

a = np.arange(20).reshape(4,5)
print(a)
# 现要取出其中的6和16,可以采用逗号分隔的形式
b = a[[1,3],[1,1]] 
b
[[ 0  1  2  3  4][ 5  6  7  8  9][10 11 12 13 14][15 16 17 18 19]]
array([ 6, 16])

 布尔索引

布尔索引其实就是利用bool值,来对数组中某些元素进行筛选。

示例:

a = np.array([1,2,3,4,5,6])
#获取其中大于3的数
b = a>3
b
array([False, False, False,  True,  True,  True])

 接着我们在借助这个布尔数组b,来筛选出a数字中大于3的元素:

a = np.array([1,2,3,4,5,6])
#获取其中大于3的数
b = a>3
print(b)
c = a[b]
c
[False False False  True  True  True]
array([4, 5, 6])

切片

切片操作和python中列表切片操作一样。

语法[start:stop:step]

  • start:切片起始位置;
  • stop:切片终止位置;
  • step:步长,每次跳过元素的个数,默认1。

一维数组切片

a = np.array([1,2,3,4,5,6])
#现要切出4以后的数
b = a[3::]
b
array([4, 5, 6])

二维数组切片

对于二维数组切片,我们采用逗号隔开的方式来进行切片,例如:

a[1:3,1:4]表示的就是从第一个维度(行)索引1到2(不包含2),在从第二个维度(列)的索引1到4(不包含4)的子数组。

a = np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[11,11,11,11,11]
])
# 现在要从a数组中提取出第二行到第三行的元素
b = a[1:3]
print(b)
# 再从这两行中,只提取中间3列的元素
b = a[1:3,1:4]
print(b)
[[ 6  7  8  9 10][11 12 13 14 15]]
[[ 7  8  9][12 13 14]]

多维数组切片

对于二维及二维以上的数组,我们都采用逗号隔开的方式来切片多个维度。

当然,我们也可以采用“...”的方式简化操作。

# 生成一个2*3*4的三维数组
a = np.arange(24).reshape(2,3,4)
print(a)
print(a[1,...]) #等价a[1,:,:]
print(a[...,1]) #等价a[:,:,1]
[[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]][[12 13 14 15][16 17 18 19][20 21 22 23]]]
[[12 13 14 15][16 17 18 19][20 21 22 23]]
[[ 1  5  9][13 17 21]]

广播机制

广播(Broadcast)是numpy对不同形状的数组进行数值运算的方式,对数组的算术运算通常在相应的元素上进行。

广播机制会对形状小的数组进行自动扩展,使得两个数组的形状相同再进行运算。

规则

  • 让所有输入数组都向其中形状最长的数组看齐,形状中农不足部分都通过前面加1补齐;
  • 输出数组的形状是输入数组形状的各个维度上的最大值;
  • 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度都为1时,这个数组能够用来计算,否则出错;
  • 当输入数组的某个维度的长度为1时,沿着此维度运算时都用此维度上的第一组值。

 示例:

a = np.array([[1,2,3],[4,5,6]
])
b = np.array([1,2,3])
print(a.shape)
print(b.shape)
c = a*b
print(c,c.shape)
(2, 3)
(3,)
[[ 1  4  9][ 4 10 18]] (2, 3)

可以看到,b数组会被扩展到和a一样的形状,再进行运算。

理解

  • 将两个数组的维度大小右对齐,然后比较对应维度上的数值;

  • 如果数值相等或其中一个为1或者为空,则能进行广播运行;

  • 输出的维度大小为取数值大的数值,否则不能进行数组运算。 

 所以在广播时候,需要注意数组维度其中要么有一个是1,要么维度都相等。

以上就是本篇所有内容咯,若有不足,欢迎指正~

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

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

相关文章

Seata序列化优化

Apache Seata(incubating) 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 本篇文章主要介绍Seata序列化实现优化。Seata对于网络传输数据,提供了多种序列化实现,包含Seata自身的序列化实现、…

一元n次多项式加法【数据结构-链表】

一元n次多项式定义如下: 其中Ai​为实数,i为不小于0的整数。在完成“一元n次多项式输入输出”题目的基础上实现一元n次多项式的加法。要求用链表实现上述一元n次多项式的操作。 输入格式: 有两个一元n次多项式,例如分别为: f(X)…

80.【C语言】数据结构之时间复杂度

目录 1.数据结构的定义 2.算法的定义 3.算法的效率 1.衡量一个算法的好坏的方法 例题:计算以下代码的循环次数 2.大O的渐进表示法 练习1:求下列代码的时间复杂度 练习2:求下列代码的时间复杂度 练习3:求下列代码的时间复杂度 练习4:求下列代码的时间复杂度 4.总结:计…

Leetcode—1115. 交替打印 FooBar【中等】(多线程)

2024每日刷题(180) Leetcode—1115. 交替打印 FooBar C实现代码 class FooBar { private:int n;sem_t fooSem;sem_t barSem;public:FooBar(int n) {this->n n;sem_init(&fooSem, 0, 1);sem_init(&barSem, 0, 0);}~FooBar() {sem_destroy(&…

mac安装brew时踩坑解决方案

安装包 mac上如果按照git等工具可能会使用brew,例如使用:$ brew install git命令,如果电脑没有按照brew,则会提示:zsh: command not found: brew 解决方案 需要我们打开brew的官网https://brew.sh/,复制…

机器学习|Pytorch实现天气预测

机器学习|Pytorch实现天气预测 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 电脑系统:Windows11 显卡型号:NVIDIA Quadro P620 语言环境:python 3.9.7 编译器&#x…

得物App3D创新应用引关注,世界设计之都大会启幕

近日,2024世界设计之都大会(WDCC)在上海盛大启幕。此次大会以“设计无界 新质生长”为主题,汇聚了全球设计领域的精英与前沿成果,展现了设计作为新质生产力的巨大潜力。主场展览占据了整整3个楼面,总面积达…

进程间关系与守护进程

一、进程组 1.1、什么是进程组 提到进程的概念, 其实每一个进程除了有一个进程 ID(PID)之外 还属于一 个进程组。进程组是一个或者多个进程的集合, 一个进程组可以包含多个进程。 每一 个进程组也有一个唯一的进程组 ID(PGID), 并且这个 PG…

SCI英文文献阅读工具【全文翻译】【逐句翻译】

关注B站可以观看更多实战教学视频:hallo128的个人空间 SCI英文文献阅读工具【全文翻译】【逐句翻译】 1. 全文翻译【DeepL】 适用于泛读网址:https://www.deepl.com/zh/translator/files 1.1 前提 文档大小:pdf文档不超过5M(可先…

设计模式05-创建型模式(建造者/原型/单例模式/Java)

3.4 建造者模式 3.4.1 建造者模式的定义 动机:方便创建复杂对象(一个对象中包含多个成员变量) 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂…

计算机视觉中的最小二乘法:寻找完美交点和直线拟合

Hello,小伙伴们!今天我们要聊的是计算机视觉中的一个小技巧——使用最小二乘法来进行交点计算和直线拟合。你有没有想过,如何从一堆杂乱无章的数据点中找到那条最佳拟合直线?或者,如何确定几条直线相交的确切位置&…

OpenCV物体跟踪:使用CSRT算法实现实时跟踪

目录 简介 CSRT算法简介 实现步骤 1. 初始化摄像头和跟踪器 2. 读取视频帧和初始化跟踪 3. 实时跟踪和显示结果 4. 显示和退出 5、结果展示 总结 简介 在计算机视觉和视频处理领域,物体跟踪是一项核心技术,它在监控、人机交互、运动分析等方面…

CSS布局/简单应用

思考下面四个图片如何布局 test1 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

双十一有啥好用的物品可以推荐购买?2024不可错过的必囤好物清单!

双十一购物狂欢节即将拉开帷幕&#xff0c;许多朋友们可能还在犹豫不决&#xff0c;不知道应该选购哪些商品。别担心&#xff0c;今天我特意为大家精心准备了一份包含五款必囤好物的清单&#xff0c;希望能够帮助大家在双十一期间抢购到心仪的商品&#xff0c;享受购物的乐趣&a…

《米小圈动画成语》|在趣味中学习,在快乐中掌握成语知识!

作为一名家长&#xff0c;我一直希望孩子能够在学习的过程中既感受到乐趣&#xff0c;又能获得真正的知识。成语作为中华文化的精华&#xff0c;虽然意义深远、简洁凝练&#xff0c;但对于一个小学生来说&#xff0c;学习和理解这些言简意赅的成语无疑是一个挑战。尤其是有些成…

将本地文件上传到GIT上

上传文件时&#xff0c;先新建一个空文件&#xff0c;进行本地库初始化&#xff0c;再进行远程库克隆&#xff0c;将要上传的文件放到克隆下来的文件夹里边&#xff0c;再进行后续操作 1.在本地创建文件夹&#xff0c;将要上传的文件放在该文件下 2.在该文件页面中打开Git Bas…

ai字幕用什么软件制作?6款视频加字幕工具分享!

在视频制作和后期处理中&#xff0c;字幕的添加是一个重要的环节。随着AI技术的发展&#xff0c;越来越多的软件开始支持AI自动加字幕功能&#xff0c;使得字幕的制作变得更加简单和高效。本文将为大家介绍几款常用的AI字幕制作软件&#xff0c;并详细讲解如何使用AI自动加字幕…

TDD(测试驱动开发)是否已死?

Rails 大神、创始人 David Heinemeier Hansson 曾发文抨击TDD。 TDD is dead. Long live testing. (DHH) 此后, Kent Beck、Martin Fowler、David Hansson 三人就这个观点还举行了系列对话&#xff08;辩论&#xff09; Is TDD Dead? 笔者作为一个多年在软件测试领域摸索的人&…

Linux——动态卷的管理

确保已经设置了对应的动态卷的驱动&#xff08;provisioner 制备器&#xff09;基于动态驱动创建对应的存储类创建PVC &#xff08;PVC 将会自动根据大小、访问模式等创建PV&#xff09;Pod的spec 中通过volumes 和 volumemounts 来完成pvc 的绑定和pvc对应pv的挂载删除pod 不…

Java基于微信小程序的公考学习平台的设计与实现,附源码+文档

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…