zoukankan      html  css  js  c++  java
  • Numpy 迭代数组

    Numpy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。

    迭代器最基本基本的任务是可以完成数组元素的访问。

    接下类我们使用arange() 韩式创建一个2*3数组,并使用 nditer 对它进行迭代。

    实例:
    import numpy as mp
    
    a = np.arange(6).reshape(2, 3)
    print("原始数组是:")
    print(a)
    print('
    ')
    print(迭代输出元素,')
    for x in np.nditer(a):
        print(x, end="")
    print('
    ')
    
    输出结果为:
    
    原始数组:
    [[0 1 2]
    [3 4 5 ]]
    
    迭代输元素:
    012345

    以上实例不是使用标准 C 或者 Forlran 顺序,选择的顺序是和数组内存布局一致的,这样做事为了提升访问的效率,默认的行序优先(row=major order,或者说是 C-order)。

    这反映了默认情况下只需访问每个元素,而无需考虑其特定的顺序,我们k可以通过迭代上述数组的转值老看到这一点,并与以 C

     顺序访问数组专职的 copy 方式做对比,如下实例:
     

    import numpy as np
    
    a = np.arange(6).reshape(2, 3)
    for x in np.nditer(a.T):
        print(x, end="")
    print("
    ")
    
    for x in np.nditer(a.T.copy(order='C')):
        print(x, end="")
    print("
    ")
    
    
    输出结果为:
    
    012345031425

    从以上例子可以看出,a 和 a.T 是我遍历顺序是一样的,也就是他们在内存中的存储顺序数一样的,但是a.T.copy(order = 'C')的遍历结果是不同的,那是因为它和前两种方式是不一样的,默认是按行访问:

    控制遍历顺序:

      for x in np.nditer(a, order='F') : Forlran order,即是列徐优先;

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

    import numpy as  np
    
    a = np.arange(0, 60, 5)
    a = a.reshape(3, 4)
    print("原始数组,")
    print(a)
    print('
    ')
    print("原始数组的转置:")
    
    b = a.T
    print(b)
    print('
    ')
    print('以 C 风格顺序排序:')
    
    c = b.copy(order='C')
    print(c)
    for x in np.nditer(c):
        print(x, end='')
    print('
    ')
    print('以 F 风格顺序排序:')
    c = b.copy(order='F')
    print(c)
    for x in np.nditer(c):
        print(x, end='')
    
    
    输出结果为:
    
    原始数组为:
    [[ 0  5 10 15]
     [20 25 30 35]
     [40 45 50 55]]
    
    原始数组转置为:
    
    [[ 0 20 40]
     [ 5 25 45]
     [10 30 50]
     [15 35 55]]
    
    以 C 的风格顺序排序:
    [[ 0 20 40]
     [ 5 25 45]
     [10 30 50]
     [15 35 55]]
    0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55, 
    
    
    以 F 的风格顺序排序:
    [[ 0 20 40]
     [ 5 25 45]
     [10 30 50]
     [15 35 55]]
    0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55,

    广播迭代:

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

    imort numpy as np
    
    a = np.arange(0, 60, 5)
    a = a.reshape(3, 4)
    print(‘第一个数组为:’)
    print(a)
    print('
    ')
    print('第二个数组为:')
    b = np.array([1, 2,  3, 4], dtype = int)
    print(b)
    print('
    ')
    print('修改后的数组为:')
    for x,y in np.nditer([a, b]):
        print("%d:%d" % (x, y), end=", ")
    
    
    输出结果为:
    第一个数组为:
    [[ 0  5 10 15]
     [20 25 30 35]
     [40 45 50 55]]
    
    
    第二个数组为:
    [1 2 3 4]
    
    
    修改后的数组为:
    0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4,
  • 相关阅读:
    Linux tcpdump 命令详解与示例
    Linux 查看磁盘IO并找出占用IO读写很高的进程
    Rsync 服务部署与参数详解
    Linux curl 表单登录或提交与cookie使用
    Linux curl 常用示例
    Linux curl 命令详解
    Linux下使用 github+hexo 搭建个人博客07-next主题接入搜索和站点管理
    Linux下使用 github+hexo 搭建个人博客06-next主题接入数据统计
    Linux下使用 github+hexo 搭建个人博客05-next主题接入评论系统
    Linux下使用 github+hexo 搭建个人博客04-next主题优化
  • 原文地址:https://www.cnblogs.com/jcjc/p/10795438.html
Copyright © 2011-2022 走看看