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

news2024/12/28 21:23:55

目录

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.coloradmin.cn/o/2221269.html

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

相关文章

本地生活便民信息服务小程序源码系统 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程

系统概述 地方门户分类信息网站源码系统是一个基于PHP和MySQL开发的强大平台,旨在帮助用户轻松搭建地方性的分类信息网站。该系统集成了众多实用功能,支持用户自由发帖、浏览和搜索各类信息,如二手交易、求职招聘、房屋租售、生活服务、商家…

【java】抽象类和接口(了解,进阶,到全部掌握)

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 大家好我们今天来学习Java面向对象的的抽象类和接口,我们大家庭已经来啦~ 一:抽象类 1.1:抽象类概念 在面向对象的概念中…

练习题(动态规划)

一,最长上升子序列2 题目: 思路分析: 之前的最长上升子序列的时间度是O(n^2),同时集合划分是按以第 i - 1 个数是几来划分的,状态转移方程也很简单是 f[i] f[j] 1 ,最后取所有一个max 那怎么优化呢&am…

ST7789读取ID错误新思路(以STC32G为例)

1.前言 前两天刚把ST7789写入搞定,这两天想折腾一下读取。最开始是读ID,先是用厂家送的程序,程序里面用的是模拟I8080协议,一切正常。后来我用STC32G的内置LCM模块,发现读取不出来。更神奇的是ID读不出来,…

【AIGC】AI如何匹配RAG知识库: Embedding实践,语义搜索

引言 RAG作为减少模型幻觉和让模型分析、回答私域相关知识最简单高效的方式,我们除了使用之外可以尝试了解其是如何实现的。在实现RAG的过程中Embedding是非常重要的手段。本文将带你简单地了解AI工具都是如何通过Embedding去完成语义分析匹配的。 Embedding技术简…

HTB:Headless[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which is the highest open TCP port on the target machine? 2.What is the title of the page that comes up if the site detects an attack in the contact support form? 使用浏览器访问靶机5000端口 3.What is the name of the …

海量数据在有限资源上处理的方法

1. 使用哈希 适用场景:需要处理的数据中,相同的数据可以分配到同样的机器/文件进行处理。 技巧总结:相同的数会哈希到同一个位置上 这类题目一般面试官给的描述都不是很清晰,需要自己去问条件、然后给出方案。 回答思路是&#…

hdfs的客户端(big data tools插件)

1.下载hadoop的压缩包在Windows,后解压 2.下载hadoop.dll文件和winutil.exe文件(网上自行查找) 下载完把这两个文件放入hadoop的bin目录 3.设置环境变量: $HADOOP_HOME指向hadoop的文件夹 4.在jetbrains公司的软件里下载big data tools插件:(在此展示的idea的) 下载完重启ide…

AI金融攻防赛:YOLO模型的数据增强与性能优化(DataWhale组队学习)

引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。在前一篇文章中,我们详细介绍了如何在金融场景凭证篡改检测中应用YOLO算法。本文将在此基础…

深入了解Spring重试组件spring-retry

在我们的项目中,为了提高程序的健壮性,很多时候都需要有重试机制进行兜底,最多就场景就比如调用远程的服务,调用中间件服务等,因为网络是不稳定的,所以在进行远程调用的时候偶尔会产生超时的异常&#xff0…

渗透测试实战—教育攻防演练中突破网络隔离

免责声明:文章来源于真实渗透测试,已获得授权,且关键信息已经打码处理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本…

3.matplotlib基础及用法(全)

一.基础绘图 折线图plot散点图scatter柱状图bar饼图pie 二.图表设置 设置标题设置线条设置坐标轴添加图例添加注释设置画布大小与分辨率 三.高级功能 绘制子图保存图形 一.基础绘图 1.折线图plot import matplotlib.pyplot as plt x [1, 2, 3, 4, 5] y [2, 3, 5, 7, 11] pl…

如何选择合适的电感器来匹配感性负载?

在匹配感性负载时,选择合适的电感器是至关重要的。电感器的主要作用是抑制电流变化,从而维持电路的稳定性。为了确保电路的稳定运行,需要考虑以下因素: 1. 电流和电压:首先,需要确定电感器的额定电流和额定…

GJS-WCP

不懂的就问,但我也是二把手......哭死 web GJS-ezssti 很常规的ssti模板注入,只过滤了"/","flag"。 过滤了/,flag 可以利用bash的特性绕过,如字符串截取,环境变量等等。payload1: {{url_for.__globals__[…

【uniapp】微信小程序使用echarts图表记录

1、插件引入 在Dcloud插件市场下载echarts插件:插件地址 或去相关代码库下载js:gitee地址 将static文件夹下中的echarts.min.js和ecStat.min.js复制到自己项目的static文件夹内或到echarts官方定制自己需要的图表类型下载js文件并放入相关目录。echart…

让你的 IDEA 使用更流畅 | IDEA内存修改

随着idea使用越来越频繁,笔者最近发现使用过程中有时候会出现卡顿现象,例如,启动软件变慢,打开项目的速度变慢等: 因此如果各位朋友觉得最近也遇到了同样的困惑,不妨跟着笔者一起来设置IDEA的内存大小吧~ …

【C#】在 WinForms 中使用 MVVM(Model-View-ViewModel) 设计模式

结合当前的 DevExpress 项目,在 WinForms 中使用 MVVM(Model-View-ViewModel) 设计模式。这个例子将通过数据绑定、命令绑定来展示 MVVM 模式的运用。 1. 项目结构 假设我们要实现一个简单的应用程序,它有一个文本框和一个按钮&…

【C++指南】类和对象(四):类的默认成员函数——全面剖析 : 拷贝构造函数

引言 拷贝构造函数是C中一个重要的特性,它允许一个对象通过另一个已创建好的同类型对象来初始化。 了解拷贝构造函数的概念、作用、特点、规则、默认行为以及如何自定义实现,对于编写健壮和高效的C程序至关重要。 C类和对象系列文章,可点击下…

【计网】理解TCP全连接队列与tcpdump抓包

希望是火,失望是烟, 生活就是一边点火,一边冒烟。 理解TCP全连接队列与tcpdump抓包 1 TCP 全连接队列1.1 重谈listen函数1.2 初步理解全连接队列1.3 深入理解全连接队列 2 tcpdump抓包 1 TCP 全连接队列 1.1 重谈listen函数 这里我们使用…

【JAVA】第三张_Eclipse下载、安装、汉化

简介 Eclipse是一种流行的集成开发环境(IDE),可用于开发各种编程语言,包括Java、C、Python等。它最初由IBM公司开发,后来被Eclipse Foundation接手并成为一个开源项目。 Eclipse提供了一个功能强大的开发平台&#x…