手把手Numpy入门教程【二】——数组与切片

NumPy 三维数组以及高维数组切片和索引 1,Indexing and slicing numpy arrays https://www.pythoninformer.com/python-libraries/numpy/numpy-and-images/ In this section we will look at indexing and slicing. These work in a similar way to indexing and slicing with standard Pythonlists, with a few d. 阅读详情

本文始发于个人公众号:TechFlow,原创不易,求个关注


今天是Numpy专题的第二篇,我们来进入正题,来看看Numpy的运算。

上一篇文章当中曾经提到过,同样大小的数据,使用Numpy的运算速度会是我们自己写循环来计算的上百倍甚至更多。并且Numpy的API非常简单,通常只要简单几行代码就可以完成非常复杂的操作。


计算与广播


在Python中的数组无论是什么类型,我们是无法直接对其中所有的元素进行计算的。想要做到这一点,必须要通过map这样的方式操作。而Numpy当中,我们可以很方便地对一整个数组或者是矩阵进行各式的计算。

首先,我们先定义一个Numpy的数组:

arr = np.array([[1,2,3],[2,2,3]])

image-20200516161939969

首先而我们来看一下基本的四则运算:

image-20200516162021455

这张图中我们可以看出两点,首先是Numpy当中的数组重载了四则运算符,我们可以直接通过加减乘除进行计算。第二点是Numpy自动替我们做了映射,虽然我们运算操作的对象是数组本身,但是Numpy自动替我们映射到了其中的每一个元素。

如果你不喜欢直接运算,想要使用Numpy的api进行调用,也是一样可以的。Numpy当中也为加减乘除提供了api。

image-20200516162427254

我们甚至还可以比较两个数组的大小,得到的结果是一个bool型的数组,代表其中每一个元素的大小关系。

image-20200516162534018

除了列举的这些之外,Numpy当中还提供了许多其他的api来进行各种计算,几乎囊括了所有常见的数学计算公式。比如log、exp、pow、开方、三角函数等等计算,基本上api的名称和math当中的一样,大家也没有必要都记住,基本上可以根据英文猜出来,一般来说记住常用的,其他的可以等到使用的时候再查阅。


广播


理解了Numpy中的基本操作之后,接下来要介绍一个非常重要的概念,叫做广播。如果这个概念理解不到位,那么后来在使用的过程当中,会遇到很多头疼的问题,或者是总是看不懂别人的代码。

广播的英文叫做broadcasting,这个思想应用的范围很广,比如分布式消息中间件等很多领域都有化用。在Numpy计算当中,广播指的是将一个小的数据应用在大数据的计算上。这个概念其实很形象,我们来看个例子。

比如我们想要对Numpy中的数组每一位的元素都加上3,我们当然可以创造出一个同样大小的数组来,然后再把它们相加。但是大可不必这么麻烦,我们直接用原数组加上3即可,Numpy内部会发现3和我们的数据大小不一致,然后自动帮我们把3拓充到和我们的数据一样大小的数组再进行计算:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d5OM0glu-1589762176089)(https://tva1.sinaimg.cn/large/007S8ZIlgy1geudfdqm24j30lg04iaa7.jpg)]

它其实等价于:

np.full_like(arr, 3) + arr

如果你能理解了上面这个操作,那么同样的,我们要对所有的元素平方或者是开方也都不在话下了:

image-20200516163141477

广播并不是只可以用在数组和一个整数之间,还可以用在数组和另外一个规模更小的数组当中,但是会对两者的shape有所要求。Numpy规定,两个数组的shape必须相等或者其中一个为1才可以执行广播操作。

比如说刚才我们创建的arry数组的shape是(3, 2),我们可以让它和一个大小是(1, 2)或者是(3, 1)的“小数组”进行运算,这同样是支持的。

如果你看不明白上面的计算过程, 我下面用一张图做一下演示。

image-20200516164211467

从图中可以看到左边的数组shape是(2, 3),右边的数组shape是(2, 1),满足Numpy对于广播机制的要求。Numpy会自动对右边数组shape为1的维度进行广播,也就是将它复制若干份使得它们的shape相等。如果你把左边的数组看成是若干个听广播的人,右侧的数组看成是消息的话,那么广播机制就是把消息复制若干份,让每一个听广播的人听到同样的内容。所以这个名字还是很形象的。


切片


Python中数组为人称道的很重要的一点就是它的切片操作非常方便,Numpy作为依托于Python的计算包,自然也继承了这一点,所以在Numpy当中,我们也可以很方便地使用切片功能。切片的使用方法和Python基本是一样的。

我们用上下标加上冒号来表示我们想要切片的范围, 和Python一样,这是一个左闭右开的区间。

我们也可以省略其中的一个范围,只提供上界或者是下界:

image-20200516165031942

我们还可以上下界都省略,表示全部都要,以及倒序切片的方法也和Python是一样的。

image-20200516165127699

但是有一点不太一样,Numpy中的切片和golang中的切片比较像,它代表原数组一段区间的引用,而不是拷贝。也就是说我们修改切片中的内容是会影响原数组的,我们对一个切片赋值,明显可以发现原数组的对应位置发生了改变。

image-20200516165245162

这么设计的原因和golang是一样的,因为Numpy是为了大数据计算而诞生的,大数据计算显然性能是一个非常重要的考量指标。如果这里不是设计成引用,而是拷贝的话,那么当一个大的切片产生的时候,必然会涉及到大量拷贝的操作。不仅非常消耗内存,并且也会占用大量计算资源。如果使用引用可以非常快速地返回结果。

golang当中如此设计,也是一样的道理。

那问题来了,如果我们想要拷贝出一份切片出来,而不是获得一个切片应该怎么办?答案也很简单,我们可以调用copy方法,获取一份拷贝。

arr[3:10].copy()

索引


理解了切片的用法之后,我们接下来看看索引。索引也是Numpy当中非常重要的概念,应用也非常普遍。

Numpy当中的索引对应数组中的维度,比如一个二维的数组,当我们用下标访问的时候,获得的其实是一个一维的数组。所以如果我们想要访问一个具体的元素的时候,能做的就是继续往下指定下标:

image-20200516171154055

这个很好理解,和Python当中的多维数组的用法是一样的。上面我们用了两个方括号去锁定一个元素的位置,为了写起来方便,我们还可以用逗号分隔查询。友情提醒,Python原生的数组并不支持这样的操作,不要搞混哦。

同样的道理,如果是多维的数组也是一样的,我们依次写出从0到k维的坐标来获取一个固定的元素。如果我们给出的坐标信息较少,那么则会获得一个数组。

拿3维数组举例,如果我们访问的时候只用一个下标,那么我们获得的是一个二维数组。如果使用两个下标,则获得的是一个一维数组。对于更高的维度也是同样。


结尾


今天的文章我们一起了解了Numpy当中常见的计算api以及广播和索引机制,关于索引的使用今天只是开了个头,还有很多非常灵活的用法,由于篇幅的限制,我们分成了多篇文章,会在之后的文章当中一一介绍。

今天介绍的也是Numpy的基础内容,除了广播机制稍稍需要思考一下之外,其余的应该都非常简单,我相信大家都能看明白。Numpy之所以普及,除了速度快之外,api简单易用,学习成本低也是很大的特点。

各位看官,喜欢本文的话点个关注呗

在这里插入图片描述

第3关:Numpy数组的切片与索引 *相关知识 一维Numpy数组的切片操作与Python列表的切片一样。下面首先来定义数字0 1 2直到8的数组,然后通过指定下标3到7来选择数组的部分元素,这实际上就是提取数组中值为3到6的元素。 In: import numpy as np In: a = np.arange(9) In: a[3:7] Out: array([3,4,5,6]) 同时用下标选择元素,下标范围从0到7,并且下标每次递增2,如下所示: In: a[:7:2] Out:array([0,2,4,6]) 也可以像Python数组 阅读详情

相关推荐

对numpy中数组元素的统一赋值实例

下面小编就为大家分享一篇对numpy中数组元素的统一赋值实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Python中numpy数组切片:print(a[0::2])、[::-1]、[::2]、[:,2]、[1:,-1:]、[ : ,: -1],[:,-2:]、[ : n]、[m : ]等含义(详细)

numpy 一维、二维数组切片操作,附详细示例。数组切片用到的负数值怎么理解附了很多例子!a[:-1],a[::-1],a[-2:-1],a[-2::-1]、X[ : , :-1],X[ : ,-1: ],x[:,-2:],x[:,-2:-1]可以自己试一试就懂了。

锵锵锵锵蒋的博客 19万+

32位MIPS流水线CPU设计

32位MIPS流水线CPU设计(vivado)

m0_51320209的博客 3199

Numpy 数组切片

Numpy 数组切片

岳来的博客 1万+

Transformer模型在语义通信中的实战应用:从信源编码到端到端优化

本文深入探讨了Transformer模型在语义通信中的实战应用,从信源编码到端到端优化。文章分析了Transformer凭借其强大的全局依赖建模能力,如何成为实现高效语义提取与传输的理想架构,并提供了构建可端到端训练系统的具体实现思路与评估方法,旨在为下一代智能通信系统提供技术参考。

o9p0q1的博客 689

【论文详解】AlphaGenome——Sequence-to-Multimodal-Genome-Track

**AlphaGenome** 是由 **Google DeepMind** 于 2025 年 6 月发布的突破性 AI 模型,专门用于预测非编码区遗传变异的功能效应。该模型采用受 **U-Net** 启发的卷积架构结合 **Transformer** 模块,创新性地解决了传统模型在输入序列长度与预测分辨率之间的核心矛盾——能够在 **1M 碱基对的超长上下文** 下实现 **单核苷酸分辨率** 的精准预测。

zwhszdx的博客 958

numpy.array多维数组的切片操作总结

numpy.array多维数组的切片操作总结一 常规介绍1 一维数组切片2 二维数组的切片3 维数超过 3 的多维数组,可通过 '…' 来简化操作4 numpy中对切片元素的操作会影响原数组本身5 array和list的对比6 boolean/mask index二 多维数组array[index,index]和array[index][index]的区别 一 常规介绍 1 一维数组切片 一维数组类似于一条直线(一维),其上的坐标位置用一个数字就可表示,一个数字代表一个位置,对应一个值。 >>&

LIWEI940638093的博客 1万+

matlab kwave模拟超声换能器学习笔记

kwave模拟超声换能器的学习笔记,从零开始造车轮

SolvingMaster的博客 3195

numpy的数组切片讲解

import numpy as np a = np.array([[1.1,2.1,3.1,4.1],[5,6,7,8],[9,10,11,12]]) a 使用省略号来省略数组的参数的用法 print (a[...,1]) # 索引为1的列元素 print ('--------') print (a[1,...]) # 索引为1的行元素 print ('--------') print (a[...,1:]) # 索引为1的列及剩下的所有列元素 print ('-----.

qq_41166909的博客 6100

Zemax API 与 Python 的独立应用程序

Zemax 提供了多个 python 示例代码,位于 Documents\Zemax\ZOS-API Sample Code\Python。使用以下代码,它们保存在 ZOS 文件目录中:/Documents\Zemax\Samples\API\Python。此代码块定位已安装的 OpticStudio 版本,确定根目录,创建命名空间和类,加载局部变量。如果定义的镜头需要一些特殊的编辑,例如反转,一种快速方法是从位于编程选项卡的 ZOS-API 语法帮助中找到相应的命令。重新运行整个代码块,镜头方向会改变。

jkh920184196的博客 1977

RK3588部署YOLO模型 包含模型量化+npu轻量化+ubuntu+RGA图像加速和多线程模型加速 包源码

本专栏为深度学习部署全栈学习体系,包含68篇由浅入深的教程,专为零基础学习者设计。内容涵盖TensorRT与RK3588平台部署技术,包含Jetson系列和RK系列硬件部署实战,采用"理论+源码+实战"三位一体的教学模式。学习路径从基础环境搭建到模型优化、容器化部署、多硬件平台适配,最终掌握工业级AI部署能力。特色包括C++基础教学、Docker容器化、INT8量化、多线程优化等核心技术,并附带YOLOv5、人脸检测、车牌识别等多个实战项目源码。适合算法工程师转部署方向、嵌入式开发者及对

FJN110的博客 3729

NumPy数组切片

`NumPy` 的 **​​切片(Slicing)​** ​操作允许高效地访问和操作数组的子集,其语法与 `Python` 列表类似但更强大,支持​ **​多维切片​** ​和​ **​视图机制**​​(非副本)。以下是核心用法详解

Humbunklung的专栏 1320

在Centos上从零开始部署并运行TinyWebServer服务器,过程记录(非常详细)

TinyWebServer是个什么项目?它是Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器。使用线程池+非阻塞socket+epoll(ET和LT均实现) +事件处理(Reactor和模拟Proactor均实现) 的并发模型使用状态机解析HTTP请求报文,支持解析GET和POST请求访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件实现同步/异步日志系统,记录服务器运行状态。......

AnChenliang_1002的博客 3020

Python中numpy数组切片

1、基本概念 Python中符合切片并且常用的有:列表,字符串,元组。 下面那列表来说明,其他的也是一样的。 格式:[开头:结束:步长] 开头:当步长>0时,不写默认0。当步长<0时,不写默认-1 结束:当步长>0时,不写默认列表长度加一。当步长<0时,不写默认负的列表长度减一 步长:默认1,>0 是从左往右走,<0是从右往左走遵循左闭右开原则,如:[0:9]等价于数学中的[0,9) # 字符串中用法 str = 'python' print(str[::]) #

weixin_36670529的博客 2万+

web渗透学习手册

依据多年的渗透测试项目经验及个人理解,对漏洞分类

渗透之路,攻防之间皆学问 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Numpy】03 数组的切片和索引操作深入详解

在数据分析和科学计算中,NumPy 是一个关键工具。本文将详细讲解 NumPy 数组的索引和切片操作。从基本概念入手,解释什么是索引和切片,以及它们的用途。通过一系列代码示例,你将学会如何在一维和多维数组中进行索引和切片操作,还会了解负索引的用法及其与 Python 列表切片的区别。无论你是新手还是希望巩固基础的老手,这篇博客都将为你提供实用的技巧和知识。快来探索 NumPy 数组的奇妙世界吧!

高校教师 | AI兴趣者 专注Python|大数据|LLM学习 分享浅显易懂知识体系 3332

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python 之numpy中二维数组与三维数组的切片

常见切片类型: x[n,:]、x[:,n]、x[m:n,:]、x[:,m:n] x[n,::]、x[:,n:]、x[::,n]、x[:,:,n]、x[m:n,::]、x[:,m:n:]、x[::,m:n]、x[:,:,m:n] 1、首先区分数组类型:在中括号中将m:n看做整体的前提之下,二维数组(中括号中有一个冒号),三维数组(中括号中有两个冒号) 2、需要注意到情况如:通常情况每个维...

weixin_38698410的博客 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

numpy数据索引与切片

详细介绍numpy的切片和索引,尤其是使用:进行切片,并进一步介绍了整数数组索引、布尔索引和花式索引

weixin_43092663的博客 5177

numpy数组切片:一维/二维/数组

文章目录numpy数组切片操作一维数组(冒号:)1、一个参数:a[i]2、两个参数:b=a[i:j]3、三个参数:格式b = a[i:j:s]4、例子二维数组(逗号,)取元素 X[n0,n1]切片 X[s0:e0,s1:e1]切片特殊情况 X[:e0,s1:]代码实例reference numpy数组切片操作 列表用 [ ] 标识,支持字符,数字,字符串甚至可以包含列表(即嵌套),是 python 最通用的复合数据类型。 关于索引 从左到右索引默认 0 开始,从右到左索引默认 -1 开始。 一维数组(冒号

格物致知 5314

Numpy索引和切片

特性Python 列表NumPy 数组返回结果返回新列表返回原数组的视图,数据共享多维切片只支持一维切片支持多维数组的切片操作步长支持正步长和负步长支持正负步长,且可以对每一维度使用不同步长高级索引(布尔、整数索引)不支持支持布尔索在 NumPy 中,整数索引(也称为整型数组索引)是一种强大的功能,允许你通过一个或多个整数数组来访问或修改数组中的特定元素。通过整数索引,你可以根据数组中的位置快速提取所需的数据。

m0_52854529的博客 1820

Numpy 中多维数组的切片操作与 Python

切片(slicing)操作Numpy 中多维数组的切片操作与 Python 中 list 的切片操作一样,同样由 start, stop, step 三个部分组成import numpy as np arr = np.arange(12) print 'array is:', arr slice_one = arr[:4] print 'slice begins at 0 and ends a...

澍yeah的博客 1万+

Python中numpy 数组的切片操作

Python中numpy 数组的切片操作简介取元素 X[n0,n1]切片 X[s0:e0,s1:e1]切片特殊情况 X[:e0,s1:]示例代码输出结果 简介 X[n0,n1]是通过 numpy 库引用二维数组或矩阵中的某一段数据集的一种写法。 X[n0,n1,n2]表示三维数组,N维数组则有N个参数,N-1个逗号分隔。 以二维数组为例: import numpy as np X = np.arr...

锐博客 2万+

24_Numpy数组通过切片选择和分配子数组

24_Numpy数组通过切片选择和分配子数组 在Python中,使用冒号表示的[[start:stop:step]切片,您可以选择和检索序列对象的一部分,例如列表,字符串或tapple,或分配另一个值。 也可以通过切片选择部分数组并将其提取或将另一个值分配给NumPy数组ndarray。 将描述以下内容。 切片的基础 切片一维NumPy数组ndarray 切片多维NumPy数组ndarray 查看(参考)并复制 与花式索引组合(按列表选择) 如果要提取满足条件的行和列,请参考以下文章。 18_NumP

qq_18351157的博客 1731

Numpy基础(二)索引与切片

Numpy基础:索引与切片

rylrmr的博客 1339

改变numpy的大小_Numpy入门教程「二」数组与切片

今天是Numpy专题的第二篇,我们来进入正题,来看看Numpy的运算。上一篇文章当中曾经提到过,同样大小的数据,使用Numpy的运算速度会是我们自己写循环来计算的上百倍甚至更多。并且Numpy的API非常简单,通常只要简单几行代码就可以完成非常复杂的操作。计算与广播在Python中的数组无论是什么类型,我们是无法直接对其中所有的元素进行计算的。想要做到这一点,必须要通过map这样的方式操作。而Nu...

weixin_33209661的博客 282
上一篇: 手把手golang教程——数组与切片
下一篇: 动态规划两题连刷,移动下标的小技巧
TechFlow
博客等级 码龄7年 347粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值