三、元素操作

news2024/12/23 13:39:42

1、切片和索引

ndarray对象的内容可以通过索引或切片来访问和修改,与Python中list的切片操作一样

ndarray数组可以基于0-n的下标进行索引,切片对象可以通过内置的slice函数,并设置start,stop及step参数进行,从原数组中切割出一个新的数组

import numpy as np
arr = np.logspace(1.0, 2.0, 10)
print(arr)
# 方法一:使用:冒号进行数组切割
print(arr[2:9:2])  # 从索引2开始到索引7停止,间隔为2
# 方法二:使用slice函数
s = slice(2,9,2)
print(arr[s])

[ 10. 12.91549665 16.68100537 21.5443469 27.82559402
35.93813664 46.41588834 59.94842503 77.42636827 100. ]

[16.68100537 27.82559402 46.41588834 77.42636827]

切片还可以包含省略号…,来使选择元组的长度与数组的维度相同。如果在行位置使用省略号,它将返回包含行中元素的ndarray

import numpy as np
arr = np.arange(1, 16)
arr1 = arr.reshape(5, 3)
print(arr1)
print(arr1[..., 1])
print(arr1[..., 1:])
print(arr1[1, ...])

[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]
[13 14 15]]

[ 2 5 8 11 14]

[[ 2 3]
[ 5 6]
[ 8 9]
[11 12]
[14 15]]

[[ 4 5 6]]

2、高级索引

Numpy比一般的Python序列提供更多的索引方式。除了之前看到的用整数和切片的索引外,数组可以由整数数组索引、布尔索引

整数数组索引
import numpy as np
arr = np.arange(1, 10)
arr1 = arr.reshape(3, 3)
print(arr1)
# (0,0) (1,1) (2,0)
print(arr1[[0, 1, 2], [0, 1, 0]])

[[1 2 3]
[4 5 6]
[7 8 9]]
[1 5 7]

布尔索引

布尔索引通过布尔运算来获取符合指定条件的元素的数组

  • 打印大于5的元素
import numpy as np
arr = np.arange(0, 12)
arr1 = arr.reshape(3, 4)
print(arr1[arr1 > 5])

[ 6 7 8 9 10 11]

  • 使用了~(取补运算符)来过滤NaN
import numpy as np
arr3 = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
print(arr3[~np.isnan(arr3)])

[1. 2. 3. 4. 5.]

3、广播

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

形状相同

如果两个数组a和b形状相同,即满足a.shape==b.shape,那么a+b的结果就是a与b数组对应位相加。

import numpy as np
arr1 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
arr2 = np.array([[9, 10, 11, 12], [13, 14, 15, 16]])
print(f"arr1 + arr2 : \n{arr1 + arr2}")

arr1 + arr2 :
[[10 12 14 16]
[18 20 22 24]]

形状不同

如果两个数组的维数不相同,则元素到元素的操作是不可能的。 然而,在numpy中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。较小的数组会广播到较大数组的大小,以便使它们的形状可兼容。

import numpy as np
arr2 = np.array([[9, 10, 11, 12], [13, 14, 15, 16]])
arr3 = np.array([1, 2, 3, 4])
print("arr3 + arr2:\n", (arr3 + arr2))

arr3 + arr2:
[[10 12 14 16]
[14 16 18 20]]

广播的规则

  • 让所有输入数组都向其中形状最长的数组看起,形状中不足的部分通过前面加1补齐

  • 输出数组的形状是输入数组形状的各个维度上的最大值

  • 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为1时,这个数组能够用来计算

  • 当输入数组的某个维度的长度为1时,沿着此维度运算时都用此维度上的第一组值

简单理解

对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足

  • 数组拥有相同形状

  • 当前维度的值相等

  • 当前维度的值有一个是1

若不满足:抛出“operands could not be broadcast together with shapes (2,4) (4,4) “异常

4、迭代

numpy.nditer基本使用

它是一个有效的多维迭代器对象,可以用在数组上进行迭代。数组的每个元素可使用Python的标准iterator接口来访问

import numpy as np
arr2 = np.array([[9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]])
for x in np.nditer(arr2):
    print(x, end=",")
print("")

9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,

行优先与列优先

import numpy as np

print(arr)
# 行优先
for x in np.nditer(arr, order='C'):
    print(x, end=",")
print("")
# 列优先
for x in np.nditer(arr, order='F'):
    print(x, end=",")

[[ 2 4 6 8 10]
[12 14 16 18 20]]

2,4,6,8,10,12,14,16,18,20,
2,12,4,14,6,16,8,18,10,20,

op_flags属性
import numpy as np
# op_flags默认是只读;使用readwrite进行读写
for x in np.nditer(arr, order='F', op_flags=["readwrite"]):
    # x[...]可以为当前迭代位置的元素
    x[...] = x ** 2
    print(x[...], end=",")

4,144,16,196,36,256,64,324,100,400,

使用外部循环

nditer类的构造器拥有flags参数,它可以接受下列值:

参数描述
c_index可以跟踪C顺序的索引
f_index可以跟踪Fortran顺序的索引
milti_index每次迭代可以跟踪一种索引类型
external_loop给出的值时具有多个值的一维数组,而不是零维数组
import numpy as np


for x in np.nditer(arr, order='C',flags=['external_loop']):
    print(x, end=",")
print("\n=====================")
for x in np.nditer(arr, order='F',flags=['external_loop']):
    print(x, end=",")

[ 2 4 6 8 10 12 14 16 18 20],

=====================
[ 2 12],[ 4 14],[ 6 16],[ 8 18],[10 20],

广播迭代

如果两个数组是可以广播的,nditer组合对象能够同时迭代它们。

import numpy as np
arr1 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
# arr2 = np.array([[9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]])
arr2 = np.array([[9, 10, 11, 12], [13, 14, 15, 16]])
# 注意使用[]中括号来表示是一个数组
for x, y in np.nditer([arr1, arr2]):
    print(x, ":", y, end=",")
print("")

1 : 9,2 : 10,3 : 11,4 : 12,5 : 13,6 : 14,7 : 15,8 : 16,

------ 以上内容均为学习笔记仅供参考,如有不准确或错误内容,望您批评指教。

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

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

相关文章

【Java寒假打卡】Java基础-反射

【Java寒假打卡】Java基础-反射概述获取Class对象的三种方式反射-获取Constructor对象利用Constructor数组创建对象获取Field对象反射获取成员变量并且使用反射获取成员对象反射获取成员对象并运行概述 Java反射机制:是在运行状态中,对于任意一个类&…

使用VS code快速搭建一个Golang项目

文章目录前言安装go语言环境了解Go开发相关的环境变量熟悉Go Module创建一个go项目项目迁移前言 VC code是一款巨好用的编辑器,使用vs code开发项目需要进行一些配置。项目中需要用到很多的包,无论是自己建的还是第三方的。由于go语言的生态环境没有jav…

【路由器连接天翼网关2.0问题解决思路】

文章目录一. 天翼网关如何切换新账号?背景操作流程1. 拔掉光纤2. 重置光猫3. 管理员页面进行认证4. 重新插上光纤,管理员页面会显示认证成功二、路由器连接光猫无网如何解决?背景操作流程1. 登陆普通管理员2. 获取超级管理员3. 登陆超级管理页…

SOLIDWORKS Electrical 2023新功能

电气工程师在完成电气原理图设计的同时,还需要频繁地修改、导出各报表,使得大量时间浪费在重复性的手动工作上。即便如此,也无法保证百分百准确无误;电气设计部门和机械设计部门虽然在设计同一产品,但不同部门之间互相…

云原生|kubernetes|2022年底cks真题解析(11-16)

前言: 接上一篇文章:云原生|kubernetes|2022年底cks真题解析(1-10)_晚风_END的博客-CSDN博客 2022年底的csk真题第二部分 11题到16题 十一, Trivy 扫描镜像安全漏洞 题目: Task 使用 Trivy 开源容器扫…

神奇的HTML系列专栏总目录

📋 前言 🖱 博客主页:在下马农的碎碎念✍ 本文由在下马农原创,首发于CSDN📆 首发时间:2023/01/16📅 最近更新时间:2023/01/16🤵 此马非凡马,房星本是星。向前…

《Linux性能优化实战》学习笔记 Day02

02 | 内存池:如何提升内存分配的效率? 原文摘抄 在 Linux 系统中,用 Xmx 设置 JVM 的最大堆内存为 8GB,但在近百个并发线程下,观察到 Java 进程占用了 14GB 的内存。为什么会这样呢? 绝大部分高级语言都…

【图论】「极简复习版」最短路径 Java/C++ 实现

文章目录Dijkstra —— 单源最短路讲解图解Java朴素使用堆优化C朴素使用堆优化Floyd —— 多源最短路讲解JavaCDijkstra —— 单源最短路 讲解 时间复杂度 朴素 Dijkstra:O(n2)O(n^2)O(n2) ,nnn 是顶点数。堆优化 Dijkstra:O(mlogn)O(m\ l…

第五届字节跳动青训营 前端进阶学习笔记(三)CSS基本概念

文章目录前言CSS是什么1.CSS基本结构2.在面中使用CSS的方式3.CSS是如何工作的选择器1.通配选择器2.标签选择器3.id选择器4.类选择器5.属性选择器6.伪类选择器7.选择符颜色1.RGB颜色2.HSL颜色3.alpha透明度字体1.font-family2.font-size3.line-height4.text-align5.space6.text-…

从头搭建pytorch Docker镜像

目录前言正文从docker hub下载镜像创建容器并运行更新容器*安装python*安装anaconda安装pytorch参考文献:前言 此文不需要前言,请从正文开始 开始搭建 正文 默认大家都是有一定docker基础的,没有的话建议去花个20分钟学一下基础知识。相对…

如何利用极狐GitLab 轻松管理NPM依赖发布与更新?

本文来自: 任治桐 极狐(GitLab) 前端工程师 NPM 是 Node.js 的包管理工具,用来安装各种 Node.js 的扩展。本文将分享如何通过极狐GitLab,让 NPM 依赖发布更新更加快速和自动化,让你轻松管理依赖,拥有更多时间专注于核…

【Java|golang】1814. 统计一个数组中好对子的数目

给你一个数组 nums &#xff0c;数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各个数字位反转得到的结果。比方说 rev(123) 321 &#xff0c; rev(120) 21 。我们称满足下面条件的下标对 (i, j) 是 好的 &#xff1a; 0 < i < j < nums.length nums[i] rev(…

算法之美~时间复杂度

时间复杂度 时间复杂度的全称是渐进时间复杂度&#xff0c;表示算法的执行时间与数据规模之间的增长关系1、只关注循环执行次数最多的一段代码2、加法法则&#xff1a;总复杂度等于量级最大的那段代码的复杂度3、乘法法则&#xff1a;嵌套代码的复杂度等于嵌套内外代码复杂度的…

文末有福利 | 零代码连接邮箱腾讯云企业网盘,附件管理超轻松

在日常工作中&#xff0c;想必大家每天都会收到各种各样的工作邮件&#xff0c;并且很多重要的文件材料也是通过邮件附件的形式来传输的&#xff0c;那么如何一站式管理这些文件&#xff0c;对于提高办公效率就至关重要了。关于邮件附件&#xff0c;相信大家也都碰到过这样的困…

【软件相关】Typora配置图片上传

文章目录0 前言1 确定需求2 开始配置2.1 软件储备2.2 插件安装2.3 gitee配置3 其他配置3.1 获取SMMS token参考链接0 前言 对于喜欢写Markdown文档的人来说&#xff0c;Typora无疑是一个写作利器&#xff0c;它有别于其他的Markdown软件&#xff0c;不是一边编辑一边渲染&#…

excel区分工时制度:如何计算996与955的工时差异

什么是996呢&#xff1f;是指早上9点上班&#xff0c;晚上9点下班&#xff0c;中午和晚上各有1小时吃饭时间&#xff0c;每周工作6天的工作模式。而955&#xff0c;也就是朝九晚五&#xff0c;中午就餐在工作时间内&#xff0c;但不能休息&#xff0c;共计8小时工作时间&#x…

[FUNC]在AHK中实现Pyhton的range函数

本文是用AutoHotkey复刻Python的range函数函数语法range(start, stop, step)参数说明&#xff1a;参数描述start计数从 start 开始。默认是从 0 开始。例如&#xff1a;range&#xff08;6&#xff09;等价于range(0,6)。stop计数到 stop 结束&#xff0c;但不包括 stop。例如&…

5、Ubuntu20常用操作_进程管理重定向和管道常用命令网络管理

进程管理 进程的概念 大家比较熟悉 Windows 下的可执行文件&#xff0c;就是那些扩展名为exe的文件。 大家知道&#xff0c;只需要鼠标双击这些程序&#xff0c; 就可以运行了。 程序运行起来后&#xff0c;我们把这个程序正在运行的 实例 称之为 进程 。 操作系统对每个进…

acwing86场周赛题解(模拟,dp,数学推导式)

目录 第一题&#xff1a;AcWing 4794. 健身 思路 核心代码 完整代码 第二题&#xff1a;4795. 安全区域 思路 核心代码 完整代码 第三题&#xff1a;4796. 删除序列 思路 核心代码 完整代码 谢谢您的阅读 第一题&#xff1a;AcWing 4794. 健身 4794. 健身 李华…

配置与管理DNS服务器

DNS概念 DNS是一种新的主机名称和IP地址转换机制&#xff0c;使用分层的分布式数据库来处理Internet上众多的主机和IP地址转换。当一个应用需要将域名翻译成为IP地址时&#xff0c;这个应用便成为域名系统的一个客户。这个客户将待翻译的域名放在一个DNS请求信息中&#xff0c;…