numpy数组的常用的数学函数 numpy数组怎么设置

本文探讨了numpy数组结合高级索引和吃尔索引使用时可能遇到的陷阱,特别是链式索引操作导致数组无法按预期修改的问题。通过分析numpy“视图”和“复制”的核心机制,文章提供了一种简单高效的向量化解决方案,避免了显式循环,确保数组能够正确高效地更新。NumPy索引机制概述:视图和复制
>在NumPy中,对数组进行索引时,结果可能是原始数组的“视图”或“副本”。理解两者之间的区别对于正确修改数组至关重要。视图:视图是对原始数组数据的引用。对视图的修改会直接反映在原始数组上,反之亦然。基本的切片(如arr[1:5])通常返回一个视图。复制:副本是对原始数组数据的引用。修改副本的副本不会影响原始数组,修改原始文件也不会影响副本。高级索引(如果使用整数数组或布尔数组进行索引)通常会返回副本。
NumPy 官方文档明确指出:“高级索引始终返回数据的副本(与基本切片视图的返回相反)。”此功能是本教程中问题的根本原因。修改 NumPy 数组时,如果不了解“复制”行为,很容易遇到意外结果。考虑以下场景:我们有一个二维数组 A、一个数组 B(与 A 相同)和两个索引条件:i_b(选择第一层的索引)和 ij_b(如果第一层已被选择,则选择第二层的掩码)。目标是基于这两个条件修改 B。 numpy as npA = np.arange(50).reshape(5, 10) # 原始数据数组B = np.full(A.shape, False) # 待电影的布尔尔电影# 选择第一层索引 i_b = np.array([0, 2, 4])# 根据A的值,ij_b的形状为(len(i_b)), A.shape[1]),即(3), 10) ij_b = A[i_b]2 == 0# 尝试使用链接修改索引 BB[i_b][ij_b] = Trueprint(quot; 使用链接索引后的B[i_b][ij_b]的值:quot;)print(B[i_b][ij_b])复制后登录
运行上述代码,输出将是:使用链接索引后的B[i_b][ij_b]的值:[False False False False False False False False False False False False False False] 登录后复制
这表示数组B没有被修改,原因是先对表达式B[i_b]求值,由于i_b是整型数组,进行的是高阶索引,因此B[i_b]返回的是B的副本。后续的[ij_b]操作就是在这个临时副本上进行,并将其元素设置为True,操作完成后丢弃此副本,对原始数组B没有任何影响。 向量化数组修改的正确方法
为了在NumPy中正确实现这种复杂的数组修改,我们需要避免链式高级索引带来的“重复”问题,在諚值操作中使用NumPy对高级索引的特殊处理。当高级索引出现在諚值语句左侧时,它会被正确定位到原始数组中相应的位置并进行修改。
以下是实现相同目标修改的向量化解决方案:numpy 搜索
numpy 搜索:360 推出新一代 AI 搜索引擎 30 查看详情 import numpy as npA = np.arange(50).reshape(5, 10) # 原始数据数组B = np.full(A.shape, False) # 待电影的布尔尔电影# 选择第一个索引 i_b = np.array([0, 2, 4])# 根据 A 的值,ij_b 的形状为 (len(i_b)), A.shape[1]),即 (3, 10)ij_b = A[i_b]2 == 0# 正确的向量化修改方法# 当高级索引 B[i_b] 在操作左侧时,会直接影响原始数组 B# ij_b 作为布尔行行,会逐行适用于B中由i_b选定的行B[i_b] = ij_bprint(quot;使用正交正视外化化故后后B[i_b][ij_b]值:quot;)print(B[i_b][ij_b])电影后方法
运行此代码,输出将是:代乐正交正视外化化故后后B[i_b][ij_b]值:[ True True True True True True True True True True True True True True]登录并复制
此时B数组修改成功。它的工作原理是:当B[i_b]是运算的左侧时,NumPy将其解释为直接修改i_b的选择中B的原始行。 ij_b的含义是:对于i_b中的每个索引k,ij_b的第k行(即ij_b[k])见值维B的第i_b[k]行(即B[i_b[k]])。继续更新B[i_b[k]。
import numpy as npA = np.arange(50).reshape(5, 10)B = np.full(A.shape,False)i_b = np.array([0, 2, 4])ij_b = A[i_b]2 == 0# 使用循环实现修改 for k in range(len(i_b)): B[i_b[k]][ij_b[k]] = Trueprint(quot;使用循环方法) B[i_b][ij_b] 的值: quot;)print(B[i_b][ij_b]) 电影后图标
输出:使用电视视题后 B[i_b][ij_b] 的值:[ True True True True True True True True True True True True True True True True True True True True] 复制后登录
循环方法虽然也能得到正确的结果,但是在处理大型数组时,性能远不如向量化。 NumPy 底层经过高度优化,可以高效地执行整个数组或子数组的操作,从而显著减少计算时间并提高代码可读性。因此,在 NumPy 编程中,向量化解决方案始终应被优先考虑。总结与最佳实践
理解 NumPy 索引机制 “查看”和“复制”之间的区别是高效正确操作数组的关键。核心原则:高级索引(无论是整数数组索引还是索引数组)在用作表达式(即读取数据或作为链式操作的中间步骤)时,将返回数据的副本。操作值:当高级索引直接位于操作的左侧时,它将正确定位并修改原始数组中的元素。避免链式陷阱:避免使用 array[index1][index2]. = value 例妖链式高级索引来修改数组,因为它通常会修改临时副本而不是原始数组。优先矢量化:始终寻求单一、复杂的索引操作(如本例中的 array[index1,index2] = value(B[i_b] = ij_b))来修改数组的矢量化,以获得最佳性能和代码清晰度。
以上就是NumPy数组修改技巧:高级索引以及索引的正确姿势,更多请关注乐哥常识网等相关文章!识别Instagram个人资料页面‘页面不可用’状态编程技巧
