• Python机器学习(四十二)NumPy 数组迭代


    NumPy提供了迭代器对象NumPy.nditer,是一个高效的多维迭代器对象,可以使用它对数组进行迭代,使用Python的标准迭代器接口访问数组元素。

    示例

    import numpy as np  
    a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])  
    print("打印数组:")  
    print(a);  
    
    print("
    ") 
    print("数组迭代:")  
    for x in np.nditer(a):  
        print(x, end=' ')  
    
    print("
    ") 

    输出

    打印数组:
    [[ 1  2  3  4]
     [ 2  4  5  6]
     [10 20 39  3]]
    
    数组迭代:
    1 2 3 4 2 4 5 6 10 20 39 3

    我们知道,numpy中的数组排序有两种:

    • F(Fortran)风格顺序,列排序
    • C(C语言)风格顺序,行排序

    默认情况下,迭代顺序通常受数组的内存布局影响,不受特定的数组排序(C风格顺序/F风格顺序)影响。

    可以看一下把上面示例中的数组转置后,对其进行迭代时的顺序。

    示例

    比较数组及其转置数组的迭代顺序:

    import numpy as np  
    a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])  
    print("打印数组:")  
    print(a)  
    print("
    ") 
    
    print("打印数组的转置:")  
    at = a.T  
    print(at)  
    
    print("
    数组迭代:")
    for x in np.nditer(a):
        print(x, end=' ')  
    
    print("
    ") 
    
    print("
    转置的数组迭代:")
    for x in np.nditer(at):
        print(x, end=' ')  
    
    print("
    ") 

    输出

    打印数组:
    [[ 1  2  3  4]
     [ 2  4  5  6]
     [10 20 39  3]]
    
    打印数组的转置:
    [[ 1  2 10]
     [ 2  4 20]
     [ 3  5 39]
     [ 4  6  3]]
    
    数组迭代:
    1 2 3 4 2 4 5 6 10 20 39 3
    
    转置的数组迭代:
    1 2 3 4 2 4 5 6 10 20 39 3

    可以看到,这两个迭代顺序是一样的,转置没有影响迭代顺序。

    迭代顺序

    要强制按F排序或C排序的顺序迭代数组,可在创建迭代对象时显式指定。

    示例

    import numpy as np  
    
    a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])  
    
    print("
    打印数组:
    ")  
    
    print(a)  
    
    print("
    打印数组的转置:
    ")  
    at = a.T  
    
    print(at)  
    
    print("
    迭代转置后的数组
    ")  
    
    for x in np.nditer(at):  
        print(x, end= ' ')   
    
    print("
    按C风格顺序迭代数组:
    ")  
    for x in np.nditer(at, order = 'C'):  
        print(x,end=' ')  

    输出

    打印数组:
    
    [[ 1  2  3  4]
     [ 2  4  5  6]
     [10 20 39  3]]
    
    打印数组的转置:
    
    [[ 1  2 10]
     [ 2  4 20]
     [ 3  5 39]
     [ 4  6  3]]
    
    迭代转置后的数组
    
    1 2 3 4 2 4 5 6 10 20 39 3
    
    按C风格顺序迭代数组:
    
    1 2 10 2 4 20 3 5 39 4 6 3 

    数组修改

    迭代数组时,默认数组值不能修改,因为迭代对象的op-flag默认被设置为只读。如要可修改,可在创建迭代对象时,把op_flags设置为readwritewrite

    示例

    import numpy as np  
    
    a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])  
    
    print("
    打印原始数组:
    ")  
    
    print(a)  
    
    print("
    遍历修改后的数组:
    ")  
    
    for x in np.nditer(a, op_flags = ['readwrite']):  
        x[...] = 3 * x;  
        print(x,end = ' ')  

    输出

    打印原始数组:
    
    [[ 1  2  3  4]
     [ 2  4  5  6]
     [10 20 39  3]]
    
    遍历修改后的数组:
    
    3 6 9 12 6 12 15 18 30 60 117 9 

    广播迭代

    如果两个数组是可广播的,可以使用组合的nditer对象对它们进行并发迭代。假设一个数组a的维数为3X4,而另一个数组b的维数为1X4,可使用以下类型的迭代器(将数组b广播到a的大小)。

    示例

    import numpy as np 
    a = np.arange(0,60,5) 
    a = a.reshape(3,4) 
    
    print ('数组a:') 
    print (a) 
    print ('
    ')  
    
    print ('数组b:') 
    b = np.array([1, 2, 3, 4], dtype = int) 
    print (b)  
    print ('
    ') 
    
    print ('同时迭代2个可广播的数组:')
    for x,y in np.nditer([a,b]): 
       print ("%d:%d" % (x,y))

    输出

    数组a:
    [[ 0  5 10 15]
     [20 25 30 35]
     [40 45 50 55]]
    
    
    数组b:
    [1 2 3 4]
    
    
    同时迭代2个可广播的数组:
    0:1
    5:2
    10:3
    15:4
    20:1
    25:2
    30:3
    35:4
    40:1
    45:2
    50:3
    55:4
  • 相关阅读:
    HiDPI的社区Wiki与部分解决方案
    Linux 桌面玩家指南:在 Ubuntu 中使用 deepin-wine,解决一些依赖 Windows 的痛点问题
    如何安装 Whisker Menu菜单
    为什么用 embed 方式插入的 Flash 元素总能把其它元素盖住?修改 z-index 属性也没用。
    Python 所谓的艺术操作
    Python 画矩形
    Python pygame中的颜色
    Python 创建一个Pycharm窗口
    Python画一个圆
    汉诺塔
  • 原文地址:https://www.cnblogs.com/huanghanyu/p/13161784.html
Copyright © 2020-2023  润新知