Numpy用法(一)

一.数组切片

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

a[x , y],x 为行索引,y 为列索引。x,y的格式都是 a : b : c ,其中 a,b,c 为整数,a 为起始索引,b 为结束索引,c 为步长。

import numpya = numpy.array([[1,2,3],[4, 5, 6]])# 查询第一、二列(其中:可以用 ... 代替)
print(a[:,0:2])# 查询第一行的第一列和第二列
print(a[0,0:2])

[[1 2]
 [4 5]]
[1 2]

二.高级索引

2.1 整数数组索引

- 使用一个数组来访问另一个数组的元素。

- 这个数组中的每个元素都是目标数组中某个维度上的索引值。

        就是把数组中元素的横纵坐标取出来,所有要取的元素的横坐标放在一个列表中,纵坐标放在另一个列表中,然后将两个列表整合成一个数组,用这个数组作为下标访问就可以得到想要的值了。

        看到这里是不是觉得有点懵,没事,举个例子就明白了:

# 示例
import numpy as np# 创建一个二维数组
a = numpy.array([[1,2,3],[4, 5, 6]])# 把元素'1'和'5'的横坐标取出来[0,1],纵坐标取出来[0,1],合并成数组就是[[0,1],[0,1]]print(a[[0,0],[0,1]])

[1 2]

        也就是说,先根据数组形状,在脑子里构建一个坐标系。你要取什么元素,就把这个元素的横坐标单独取出来,纵坐标单独取出来,然后把这两个列表组合起来当成数组下标就能拿到了你想要的元素了

还有一个特殊情况,可以用简便方法:

# 取出 4 * 3 数组四个角的数据
import numpy as npa = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])# 倒数第一行、列可以用 -1 表示
print(a[[0,0,-1,-1],[0,-1,0,-1]])

[ 1  3 10 12]

2.2 布尔索引

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

import numpy as npa = np.array([1,2,3,5,6,7])# 也就是一个包含a的表达式,把数组中每个元素都用这个表达式进行处理并返回一个布尔值
bool_idx = a > 2
print(bool_idx)# 将表达式作为下标进行访问,会返回满足条件的元素
print(a[bool_idx])

[False False  True  True  True  True]
[3 5 6 7]

# 高维数组import numpy as np# 一个二维数组
a = np.array([[1,2,3],[4,5,6],[7,8,9]])print(a)# 换个行print()# 取出满足条件的元素
print(a[a>4])

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

[5 6 7 8 9]

大的来了——

import numpy as np# 切片布尔索引
# 这里的关键点是被布尔处理后的每个元素返回一个布尔值,为True的返回该元素所在的行或列# 一个二维数组
a = np.array([[1,2,3],[4,5,6],[7,8,9]])# 布尔处理第三列中的值大于3的元素,将结果作为下标索引行
# (因为这里的表达式是写在行这边的,所以索引的是行)
print(a[a[...,2] > 3]) # 这里其实默认是(a[a[...,2] > 3],...)# 换个行
print()# 布尔处理第三行的值大于7的元素,将结果作为下标索引行
#(这里是把第三行被布尔处理后的值当作是行的索引)
print(a[a[2,...] > 7])######
# 比如这里索引的结果是[False,True,True],而表达式在行这边,所以就取下标为1和2的行
# 也就是把布尔处理后True的顺序[0(为假),1,2]作为下标,返回用这个下标的行
######

[[4 5 6]
 [7 8 9]]

[[4 5 6]
 [7 8 9]]

# 布尔处理第2行 值大于5 的元素,将其作为下标索引所在列(因为这里的表达式是写在列这边的,所以索引的是列)
print(a[:, a[1] > 5])# 换个行
print()# 布尔处理第2列 值大于4 的元素,然后将结果作为下标索引最前面取出来的一、二行中的列
print(a[0:2,a[...,1] > 4])

[[3]
 [6]
 [9]]

[[2 3]
 [5 6]]

        这里有一个简单的理解方法,a [] 的括号中是要放表达式的,可能既有行也有列,当其中一个地方(行或列)填表达式时,可以先解读表达式的结果,然后把结果代入另一个列(或行)的切片去找到满足表达式的值。

同时,布尔运算也能加上逻辑运算符,

 &:与运算,组合多个条件。

 |:或运算,组合多个条件。

 ~:非运算,取反条件。

三.广播

        是 numpy 对不同形状(shape)的数组进行数值计算的方式,要求维数相同,且各维度的长度相同,如果不相同,可以通过广播机制,这种机制的核心是对形状较小的数组,在横向或纵向上进行一定次数的重复,使其与形状较大的数组拥有相同的维度。

# 维度不同,但某一维度上长度(元素个数)相同import numpya = numpy.array([1,2,3])
b = numpy.array([[4,5,6],[7,8,9]])print(a + b)

[[ 5  7  9]
 [ 8 10 12]]

        可以看到,a的形状是 (3,) ,b的形状是 (2,3) ,a会通过广播机机制复制自身增加维度让自己的形状变成(2,3),这样a和b的形状就匹配了。

# 维度不同,没有一个维度的长度相同,但其中一个数组在该维度上的长度为 1import numpya = numpy.array([1,2,3])
b = numpy.array([[1],[2]])print(a+b)

[[2 3 4]
 [3 4 5]]

        维度不匹配的时候,先看看其中一个数组的每个维度中是否只有一个元素,如果有的话,那么就自动扩展这个维度长度,依次扩展其他维度。这里就是把b数组中的[1]扩展成[1 1 1],[2]扩展成[2 2 2]。然后就变成了长度匹配的做法了。

# 与标量相加import numpy as npa = np.array([1, 2, 3, 4])# 1 会自动扩展为[1 1 1 1]
print(a + 1)

[2 3 4 5]

其余大多数情况,都是不能进行广播的,比如:

import numpy as np# 形状为(3,)
a = np.array([1, 2, 3])# 形状为(2,2)
b = np.array([[1, 2], [4, 5]])
print(a+b)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[26], line 6
      3 a = np.array([1, 2, 3])
      5 b = np.array([[1, 2], [4, 5]])
----> 6 print(a+b)

ValueError: operands could not be broadcast together with shapes (3,) (2,2)

        也就是说,两个数组行列至少有一边长度相同,另一边长度为1;或者俩都有一边长度为1;或者一个数组的几个维度长度全为1,这样才可以进行广播相加。

四.数组遍历

4.1 遍历数组的第一维度

for i in arr

遍历数组的第一维度,即按行或列的顺序逐个访问元素,返回的是数组的子数组(如行或列),而不是单个元素。

import numpy as npa = np.array([[1, 2, 3],[4,5,6]])# 这里就是通过行来进行遍历,一维的话只需要[]就可以了,而不是[][]两个下标才能得到值
for i in a:print(i)

[1 2 3]
[4 5 6]

4.2 nditer逐个访问元素

是 NumPy 中的一个强大的迭代器对象,其中有两个重要参数:orderflags

order 参数用于指定数组的遍历顺序。默认情况下,nditer 按照 C 风格(行优先)遍历数组。

- C 风格(行优先): order='C'

- Fortran 风格(列优先): order='F'

import numpy as npa = np.array([[1, 2, 3],[4, 5, 6]])# 按列优先
for i in np.nditer(a,order='F'): print(i)# 换个行
print()# 按行优先
for i in np.nditer(a,order='C'): print(i)

1
4
2
5
3
6

1
2
3
4
5
6

flags 参数用于指定迭代器的额外行为,一般配合新建变量来使用

- multi_index: 返回每个元素的多维索引,这是一个存储数据的东西,需要引用

- external_loop: 返回一维数组而不是单个元素,减少函数调用的次数,从而提高性能。

import numpy as npa = np.array([[1, 2, 3],[4, 5, 6]])# 返回多维索引(坐标)
x = np.nditer(a,flags = ['multi_index'])
for i in x: print(i,x.multi_index)

1 (0, 0)
2 (0, 1)
3 (0, 2)
4 (1, 0)
5 (1, 1)
6 (1, 2)

# 返回一维数组# external_loop 和 order='C' 一起使用时,会将所有元素打包成一个数组返回,而不是按行打包。
x = np.nditer(a,flags = ['external_loop'],order='C')# external_loop 和 order='F' 一起使用时,会将每列的元素打包成一个数组返回。
y = np.nditer(a,flags = ['external_loop'],order='F')for i in x: print(i)# 换个行
print()for i in y: print(i)

[1 2 3 4 5 6]

[1 4]
[2 5]
[3 6]

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

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

相关文章

基于社交裂变的S2B2C电商模式创新研究——以“颜值PK+礼品卡+AI智能名片“融合生态为例

摘要 本文构建了融合开源AI技术、社交裂变机制与S2B2C商业模式的创新模型。通过开发具备AI智能名片功能的商城小程序,实现用户日均停留时长提升171%、社交转化效率提高2.8倍的实证效果。研究发现:基于GAN的虚拟形象生成技术可降低用户决策成本32%&…

王者荣耀服务器突然崩了

就在刚刚王者荣耀服务器突然崩了 #王者荣耀崩了#的话题毫无预兆地冲上热搜,许多玩家发现游戏登录界面反复弹出异常提示,匹配成功后卡在加载界面,甚至出现对局数据丢失的情况。根据官方公告,目前技术团队已在全力抢修服务器 #王者…

LabVIEW医疗设备备用电源实时监控系统

开发了一个基于LabVIEW的医疗设备备用电源实时监控系统。系统提高医疗设备备用电源的管理效能与使用安全,通过实时监测与数据分析,确保医疗设施在电力供应中断时的可靠运行。 ​ 项目背景 医院中的医疗设备对电源的连续供应有着极高的要求,…

04-SpringBoot3入门-配置文件(多环境配置)

1、简介 在 SpringBoot 中,不同的环境(如开发、测试、生产)可以编写对应的配置文件,例如数据库连接信息、日志级别、缓存配置等。在不同的环境中使用对应的配置文件。 2、配置环境 # 开发环境 zbj:user:username: root # 测试环…

C++链表详解:从基础概念到高级应用

C++链表详解:从基础概念到高级应用 链表是计算机科学中最基础也是最重要的数据结构之一,它在内存管理、算法实现和实际应用中扮演着关键角色。本文将详细介绍链表的概念、类型、C++实现以及实际应用场景,帮助读者全面理解这一重要的数据结构。 文章目录 C++链表详解:从基础…

了解图像质量评价指标PSNR

一、PSNR是什么 1.1 定义与数学公式 峰值信噪比(Peak Signal-to-Noise Ratio,PSNR)是数字图像处理领域最经典的客观质量评价指标之一。其核心思想是通过计算原始图像与失真图像之间的均方误差(MSE)来衡量失真程度&am…

NX二次开发刻字功能——布尔运算

刻字功能在经历、创建文本、拉伸功能以后就剩下布尔运算了。布尔运算的目的就是实现文本时凸还是凹。这部分内容很简单。 1、首先识别布尔运算的类型,我这里用到一个枚举类型的选项,凸就是布尔求和,凹就是布尔求差。 2、其放置位置为创建拉伸…

《C语言实现金字塔图案打印》

🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言练习题分享 🌍文章目入 程序代码程序功能程序分析外层循环内层循环输出结果 示例运行总结 在学习编程的过程中,打印图案是一个非常有趣的练习,它可…

Shiro学习(一):Shiro介绍和基本使用

一、Shiro介绍 1、百科对shiro的定义如下: Apache Shiro 一个强大且易于使用的 Java 安全框架,它提供了身份验证、授权、加密和会话管理等功能。Shiro 的设计目标是简化企业级应用程序的安全性开发过程,同时保持代码的简洁和易于维护。 2、…

Java多线程与高并发专题——关于Condition

Condition接口 源码注释 还是老样子,看看源码注释: Condition factors out the Object monitor methods (wait, notify and notifyAll) into distinct objects to give the effect of having multiple wait-sets per object, by combining them with t…

JavaScript 性能优化实战:突破瓶颈,打造极致 Web 体验

在当今快节奏的互联网时代,用户对于 Web 应用的性能要求越来越高。一个响应迅速、流畅运行的 Web 页面能够极大地提升用户体验,反之,缓慢的加载速度和卡顿的交互则可能导致用户流失。JavaScript 作为 Web 开发的核心语言之一,其性…

《白帽子讲 Web 安全》之服务端请求伪造(SSRF)深度剖析:从攻击到防御

引言 在当今复杂的网络环境中,Web 应用安全犹如一座时刻需要精心守护的堡垒。随着技术的不断演进,各类安全威胁层出不穷,其中服务端请求伪造(SSRF)正逐渐成为令开发者与安全从业者头疼的一大难题。吴翰清在《白帽子讲…

Pandas的轴,axis=0,axis=1

八. Pandas的轴 axis0代表跨行(down),而axis1代表跨列(across) 使用0值表示沿着每一列或行标签\索引值向下执行方法使用1值表示沿着每一行或者列标签模向执行对应的方法 下图代表在DataFrame当中axis为0和1时分别代表的含义: axis参数作用…

matplotlib学习

开始学习Python数据可视化 一.基础绘图函数 1.创建画布与坐标轴 import matplotlib.pyplot as plt# 创建画布和坐标轴 fig, ax plt.subplots() # 默认1行1列,返回Figure对象和Axes对象 2.绘制线图 x [1, 2, 3, 4] y [10, 20, 15, 25]# 绘制线图 ax.plot(x,…

系统架构设计前的多角度思考

首先,从需求分析入手,不仅关注当前功能,还要考虑业务未来的扩展方向。比如数据量预估增长多少?这些都是影响架构的重要因素。 然后是架构设计原则,比如分层设计、模块化、高内聚低耦合等。比如如何划分服务边界&#x…

leetcode230.二叉搜索树中第k小的元素

中序遍历,第k次出现的数值就是结果 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left…

运筹说 第134期 | 矩阵对策的解法

上一期我们了解了矩阵对策的基本理论,包含矩阵对策的纯策略、矩阵对策的混合策略和矩阵对策的基本定理。 接下来小编将为大家介绍矩阵对策的解法,包括图解法、方程组法和线性规划法三种经典方法。 01 图解法 本节首先介绍矩阵对策的图解法,…

Python贝叶斯分层模型专题|对环境健康、医学心梗患者、体育赛事数据空间异质性实证分析合集|附数据代码

全文链接:https://tecdat.cn/?p41267 在大数据时代,多水平数据结构广泛存在于环境健康、医学研究和体育赛事等领域。本专题合集聚焦贝叶斯分层模型(Hierarchical Bayesian Model)的创新应用,通过氡气污染数据与 季后…

NOI2015提高组.子串

题目 520. 子串 思路 设计状态表示 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示 a a a的前 i i i个字符, b b b的前 j j j个字符, 并且已经分割了 k k k个子串的所有方案, 将状态划分为包含第 i i i个字符和不包含第 i i i个字符, 不包含第 i i i个字符的状态是 f [ i…

医疗智能体通信整合-大模型训练中沟通优化策略研究

一、引言:医疗模型训练的沟通困境 1.1 医疗 AI 发展背景 在数智化浪潮的推动下,医疗 AI 正以前所未有的速度融入现代医疗体系。从智能影像诊断助力医生精准识别病灶,到基于大数据分析的个性化药物研发,医疗 AI 在提升医疗效率、改善医疗质量方面展现出巨大潜力。据相关数据…