Numpy数组进阶_Python数据分析与可视化

Numpy数组进阶

  • Numpy的广播机制
  • 高级索引
    • 整数数组索引
    • 布尔索引
    • 花式索引
  • 数组迭代

Numpy的广播机制

广播 (Broadcast) 是 numpy 对不同形状 (shape) 的数组,进行数值计算的方式。 对数组的算术运算通常在相应的元素上进行,当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。

如图:
在这里插入图片描述

广播的规则

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

示例:

arr1 = np.array([[0,0,0],[1,1,1],[2,2,2]])
arr2 = np.array([1,2,3])
print('arr1:\n',arr1)
print('arr2:\n',arr2)
print('arr1+arr2:\n',arr1+arr2)
#输出结果
arr1:
[[0 0 0]
[1 1 1]
[2 2 2]]
arr2:
[1 2 3]
arr1+arr2:
[[1 2 3]
[2 3 4]
[3 4 5]]

高级索引

NumPy 比一般的 Python 序列提供更多的索引方式。除了基本的用整数和切片的索引外,数组还有整数数组索引、布尔索引及花式索引。

整数数组索引

以下实例获取数组中 (0,0),(1,1) 和 (2,0) 位置处的元素。

In : x = np.arange(12).reshape((4,3))
In : y = x[[0, 1, 2],[0, 1, 0]]
In : y
Out: array([0, 4, 6])

布尔索引

以下实例获取数组中大于 7 的元素。

In : x = np.arange(12).reshape((4,3))
In : y = x[x > 7]
In : y
Out: array([8, 9, 10, 11])

花式索引

花式索引指的是利用整数数组进行索引。

花式索引根据索引数组的值,作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。

花式索引跟切片不一样,它总是将数据复制到新数组中。

传入单个索引数组
以下实例获取数组的第 5、1、2、3 行。

In : x = np.arange(15).reshape((5,3))
In : y = x[[4, 0, 1, 2]]
In : y
Out: array([12, 13, 14]
           [0, 1, 2]
           [3, 4, 5]
           [6, 7, 8])

传入多个索引数组
传入多个索引数组,则需要和 numpy.ix_ 同时使用。
numpy.ix_:传入两个参数,第一个参数为数组索引,第二个参数为排列顺序。

In : x = np.arange(12).reshape((4,3))
In : y = x[np.ix_([1, 2],[2, 1, 0])]
In : y
Out: array([5, 4, 3]

数组迭代

NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。利用nditer对象可以实现完成访问数组中的每一个元素,这项最基本的功能,使用标准的 Python 迭代器接口,可以逐个访问每一个元素。

In : x = np.arange(6).reshape(2, 3)
In : for y in np.nditer(x):
         print(y, end=" ")
Out:
0 1 2 3 4 5

控制迭代顺序
nditer 对象提供了一个命令参数,来控制迭代输出顺序,默认值是 ‘K’,即 order=‘k’。该默认值表示,按在存储器中的顺序输出。
同时 nditer 中,还提供了两个参数,控制迭代器输出顺序:

for x in np.nditer(a, order='F') # Fortran order,即是列序优先;
for x in np.nditer(a.T, order='C') # C order,即是行序优先;

修改数组元素值
默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值的修改,必须将可选参数 op_flags 指定为 read-write 或者 write-only 的模式。

In : x = np.arange(6).reshape(2, 3)
In : for y in np.nditer(x, op_flags=["readwrite"]):
         y[...] = 2 * y
In : print(x)
Out:
array([[ 0,  2,  4]
       [ 6,  8, 10]])

使用外部循环
将一维的最内层的循环转移到外部循环迭代器,使得 numpy 的矢量化操作,在处理更大规模数据时,变得更有效率。

In : x = np.arange(6).reshape(2, 3)
In : for y in np.nditer(x, flags=['external_loop'], order='F'):
         print(y)
Out:
[0, 3]
[1, 4]
[2, 5]

广播迭代
如果两个数组是可广播的,nditer 组合对象能够同时迭代它们。 假设数组 a 的维度为 34,数组 b 的维度为 14,则使用以下迭代器(数组 b 被广播到 a 的大小)。

In : a = np.arange(12).reshape(3, 4)
In : b = np.arange(4)
In : for x, y in np.nditer([a, b]):
         print("{}:{}".format(x,y), end=", ")
Out:
0:1, 1:2, 2:3, 3:4, 4:1, 5:2, 6:3, 7:4, 8:1, 9:2, 10:3, 11:4,

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

轻松实现文件改名:让新文件名与目录名称一致

在日常工作中,我们经常需要处理文件改名的问题。有时候,我们需要将新文件名设置为与目录名称相同,以方便管理和查找。然而,这个过程可能很繁琐,尤其是当你有大量的文件需要改名时。幸运的是,现在有一种简单…

Windows2019部署IIS后,浏览文件变成下载的问题解决过程

1、反复重起服务器、重建应用程序、建应用程序并改名才好使! 2、总体上,角色为: 一、在Windows2019服务器上,填加角色,一路下一步,到填加服务器角色时,勾选了【Web服务器(IIS)】 二、然后在【…

阿里云2核2G3M服务器e实例、40G ESSD Entry系统盘性能测评

阿里云99元服务器新老用户同享2核2G经济型e实例、3M固定带宽和40G ESSD Entry系统盘,老用户也可以买,续费不涨价依旧是99元一年,阿里云百科aliyunbaike.com分享阿里云3M带宽服务器40G ESSD Entry云盘性能说明: 阿里云99元服务器配…

el-table操作栏添加el-dropdown获取当前行的数据

0 效果 点击子合同获取到当前行的id 1 代码 beforeHandleCommand(row, childCommand) {return { row: row, childCommand: childCommand }; }, addChildBtn(command) {const row command.row;if (command.childCommand 0) {// todo} else {// todo} },

el-select下拉框只回显value不回显label的原因以及解决方法

项目场景: 提示:这里简述项目相关背景: 原因分析: 提示:这里填写问题的分析: el-select的采用的是map的key value结构,因此只显示value而不显示label的原因是,value的类型不正确&…

【Effect C++ 笔记】(四)设计与声明

【四】设计与声明 条款18 : 让接口容易被正确使用,不易被误用 Item 18: 让接口容易被正确使用,不易被误用 Make interfaces easy to use correctly and hard to use incorrectly. “让接口容易被正确使用,不易被误用”&#xff0…

Abaqus2023新功能:分析技术

隐式耦合的松弛和加速器方法 产品:Abaqus/Standard SIMULIA协同仿真引擎现在支持Aitkens松弛方法以及Anderson和Broyden加速器方法,为强耦合物理场提供稳健且省时高效的解决方案。此功能在 2022 FD04 (FP.2232)版本中首次提供。…

vue的常用指令

1.使用双花括号( {{}} )对变量输出,内部可以写简单的表达式用于对数据的处理 2..v-text:相当于js的innerText, 3.v-html:相当于js的innerHTML 4.v-bind:动态绑定属性,简写是冒号( : ) 5.绑定class:操作元素的 class 列表和内联样式…

Moka人事:实现无代码开发的API连接,打通电商平台与用户运营系统

无代码开发的API连接:Moka人事的核心优势 Moka人事,是北京希瑞亚斯科技有限公司于2015年推出的一款数据驱动的智能化HR SaaS产品。这款产品的主要优势在于其无需进行API开发即可实现系统的连接和集成,这不仅大大提升了企业的工作效率&#x…

2023数维杯国际赛数学建模D题思路模型分析

D题思路模型分析:详细思路获取见文末名片 问题D:洗衣清洗的数学问题 洗衣清洗是人们每天都在做的事情。洗衣粉的去污功能来自于一些表面活性剂的化学物质。它们可以提高水的渗透性,并利用分子间静电排斥机制去除污垢颗粒。由于表面活性剂分…

【汇编】Debug的使用

文章目录 前言一、Debug是什么?二、为什么Debug如此重要?三、Debug的使用3.1 Debug的运行3.1 R命令查看寄存器的状态改变寄存器的值 3.2 用D命令查看内存中的内容列出预设地址内存内容列出指定地方的内容列出指定地方的指定大小的内容 3.3 使用e命令修改…

learning to rank 学习排名系统综述

Learning to Rank 的实践 文档列表方法 Listwise 算法相对于 Pointwise 和 Pairwise 方法来说,它不再将排序问题转化为一个分类问题或者回归问题,而是直接针对评价指标对文档的排序结果进行优化,如常用的 MAP、NDCG 等。应用 Listwise 的模型…

js构造函数之工厂模式(学习笔记1)

目录 一、简单工厂 1、存储一个用户信息 2、存储N个用户信息 3、存储N个用户信息不同年龄用户有不同美食的搭配方案【简单工厂模式】 二、抽象工厂模式 1、抽象工厂(AbstractFactory) 2、具体工厂(ConcreteFactory) 3、生产新款手机 4、总结 本…

V10服务器安装virt-manage

kvm是什么 KVM(Kernel-based Virtual Machine, 即内核级虚拟机) 是一个开源的系统虚拟化模块。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。目前KVM已成为学术界的主流VMM之一,它包含一个为处理器提供底层虚拟化 可加载…

服务器数据恢复—服务器raid5离线磁盘上线同步失败的数据恢复案例

服务器数据恢复环境&故障: 某品牌DL380服务器中有一组由三块SAS硬盘组建的RAID5阵列。数据库存放在D分区,数据库备份存放在E分区。 服务器上有一块硬盘的状态灯显示红色,D分区无法识别,E分区可识别,但是拷贝文件报…

MyBatis 操作数据库(⼊⻔)

前言 通过本篇博客,我们将学到以下内容 1.使⽤MyBatis完成简单的增删改查操作,参数传递 2.掌握MyBatis的两种写法: 注解和 XML⽅式 3.掌握 MyBatis 相关的⽇志配置 什么是 MyBatis? MyBatis是⼀款优秀的 持久层 框架,⽤于简化JDBC(关于 JD…

推荐5款堪称神器的免费软件

​ 今天再次推荐5个良心好用的Windows神级软件,每一个都是完全免费,堪称神器,让你打开新世界的大门。 1.文件复制——SuperCopy ​ SuperCopy 是一款 Chrome 浏览器的扩展,可以帮助您解除网站上禁止复制、右键、全选、粘贴等限制…

Linux Docker图形化工具Portainer如何进行远程访问?

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 Portainer 是一个轻量级的容器管理工具,可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可…

easyExcle单元格合并

自定义单元格合并策略: /*** 自定义单元格合并策略** create: 2023-11-15 13:41**/ Data NoArgsConstructor AllArgsConstructor Slf4j public class EasyExcelCustomMergeStrategy implements RowWriteHandler {/*** 总数*/private Integer totalNum;//合并行计数…

填充每个节点的下一个右侧节点指针

题目链接 填充每个节点的下一个右侧节点指针 题目描述 注意点 给定一个 完美二叉树 解答思路 广度优先遍历一层层的遍历二叉树,将每一层节点的next指针都指向右侧节点 代码 class Solution {public Node connect(Node root) {if (root null) {return null;}…