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,
  • 相关阅读:
    HDU 2196 Computer
    HDU 1520 Anniversary party
    POJ 1217 FOUR QUARTERS
    POJ 2184 Cow Exhibition
    HDU 2639 Bone Collector II
    POJ 3181 Dollar Dayz
    POJ 1787 Charlie's Change
    POJ 2063 Investment
    HDU 1114 Piggy-Bank
    Lca hdu 2874 Connections between cities
  • 原文地址:https://www.cnblogs.com/jcjc/p/10795438.html
Copyright © 2011-2022 走看看