• 【Numpy总结】第六节:Numpy 元素的遍历


    一、单个数组的遍历:numpy.nditer 的使用

    迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。一般情况下的使用方式如下:for x in np.nditer(data_in, order=''),可以遍历nparray中的所有数据,举例如下:

    a = np.arange(12).reshape(3,4)
    for x in np.nditer(a):
        print(x,end=',')
    # 0,1,2,3,4,5,6,7,8,9,10,11,
    
    • 1
    • 2
    • 3
    • 4

    格式:np.nditer(data_in, order='',op_flags =[],flags=[])

    参数解释如下:

    参数解释
    data_innparray 类型的数组
    order控制遍历的顺序,可选值为:F 列优先/C 行优先, 默认为C
    op_flags控制遍历出元素的读写权限,常用:
    op_flags=['read-only'] 只读;
    op_flags=['readwrite'] 可读可写
    flags该参数通常使用flags = ['external_loop'],可以将二维数组变化为一维数组输出,详细参考下面例子

    1.1 参数:order

    通过参数 order='F' or order='C' 可以通过改变遍历的顺序;举例如下:

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

    for x in np.nditer(a,order='F'):
        print(x,end=',')
    # 0,4,8,1,5,9,2,6,10,3,7,11,
    for x in np.nditer(a,order='C'):
        print(x,end=',')
    # 0,1,2,3,4,5,6,7,8,9,10,11,
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.2 参数:op_flags

    默认情况下,nditer 对nparray进行遍历时,遍历出的元素为只读对象(read-only),若我们需要修改其中的值,需要设置:op_flags=['readwrite']

    a = np.arange(12).reshape(3,4)
    for x in np.nditer(a,op_flags=['readwrite']):
        x[...] = 2*x
    print(a)
    # [[ 0  2  4  6]
    #  [ 8 10 12 14]
    #  [16 18 20 22]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.3 参数:flags

    尝试用的参数设置为:flags = ['external_loop'] ,其余的设置不常用,就不列举了;当设置flags = ['external_loop'] 后,可以实现对二维数组的行或者列的输出,在今后的写代码过程中,给大家带来便利;举例如下:

    参数解释
    c_index可以跟踪 C 顺序的索引, 用来返回索引值
    f_index可以跟踪 Fortran 顺序的索引,用来返回索引值
    external_loop给出的值是具有多个值的一维数组,而不是零维数组

    举例:

    # 返回索引值举例
    a = np.arange(12).reshape(3,4)
    for x in  np.nditer(a,flags=['f_index'],order='F'):
        print(x,end=',')
    # 0,4,8,1,5,9,2,6,10,3,7,11,
    for x in  np.nditer(a,flags=['f_index'],order='C'):
        print(x,end=',')
    # 0,1,2,3,4,5,6,7,8,9,10,11,
    
    # 返回列方向的多个一维数组
    a = np.arange(12).reshape(3,4)
    for x in  np.nditer(a,flags=['external_loop'],order='F'):
        print(x)
    # [0 4 8]
    # [1 5 9]
    # [ 2  6 10]
    # [ 3  7 11]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    二、多个数组的遍历

    2.1 多个数组Shape相同时

    当数组Shape相同时,可以直接使用np.nditer(), 举例如下:

    a = np.arange(12).reshape(3,4)
    b = np.ones(12).reshape(3,4)
    for i,j in np.nditer([a,b]):
        print(i,"-->",int(j))
    # 输出如下:
    # 0 --> 1
    # 1 --> 1
    # 2 --> 1
    # 3 --> 1
    # 4 --> 1
    # 5 --> 1
    # 6 --> 1
    # 7 --> 1
    # 8 --> 1
    # 9 --> 1
    # 10 --> 1
    # 11 --> 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.2 多个数组Shape不同时

    当数组Shape不同时,需要满足广播规则,才可以使用广播遍历,广播规则请参考:【Numpy总结】第五节:Numpy的广播(更易理解的版本)
    举例如下:

    a = np.arange(12).reshape(3,4)
    b = np.arange(4)
    for i,j in np.nditer([a,b]):
        print(i,"-->",j)
    # 输出如下:
    # 0 --> 0
    # 1 --> 1
    # 2 --> 2
    # 3 --> 3
    # 4 --> 0
    # 5 --> 1
    # 6 --> 2
    # 7 --> 3
    # 8 --> 0
    # 9 --> 1
    # 10 --> 2
    # 11 --> 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    bochs 对 Linux0.11 进行调试 (TODO: 后面可以考虑集成 vscode+gdb+qemu)
    pytorch 模型GPU推理时间探讨3——正确计算模型推理时间
    Mac环境安装和使用supervisor
    GB/T 11945-2019 蒸压灰砂实心砖和实心砌块检测
    开发一个自己的Spring Boot Starter
    学会这招,轻松掌握学校教学质量!
    Vue.js 原理分析
    openlayers6 解决调用百度地图之各种问题
    AUTOSAR汽车电子嵌入式编程精讲300篇-基于 CAN 总线的车辆数据采集与远程监控系统研发(下)
    通信原理学习笔记6-2:数字解调——抽样和符号同步
  • 原文地址:https://blog.csdn.net/weixin_47139649/article/details/126537629