代码之家  ›  专栏  ›  技术社区  ›  Srivatsan

逐个遍历数据阵列的所有元素

  •  2
  • Srivatsan  · 技术社区  · 8 年前
    In [6]: a = np.array([[1,2,3,4],[5,6,7,8]])
    
    In [7]: b = a
    
    In [8]: a[0]
    Out[8]: array([1, 2, 3, 4])
    
    In [9]: a[0][0]
    Out[9]: 1
    

    但是我想用 zip 循环 a b 得到 a[0][0] 然后 a[0][1] a[1][3] .

    当我尝试以下方法时:

    In [11]: for i,j in zip(a,b):
        ...:     print i[0][0]
        ...:     
    ---------------------------------------------------------------------------
    IndexError                                Traceback (most recent call last)
    <ipython-input-11-8a9c71fab781> in <module>()
          1 for i,j in zip(a,b):
    ----> 2     print i[0][0]
          3 
    
    IndexError: invalid index to scalar variable.
    

    a[0][0] = 1 然后 a[0][1] = 2 高达 a[0][3] = 4 a[1][0] = 5 a[1][3] = 8 .

    5 回复  |  直到 8 年前
        1
  •  6
  •   ivan_pozdeev RenanSS    8 年前

    如果你 只是 需要循环遍历的所有元素 a 一个接一个,就是这样 ndarray.flat

    In [11]: a = np.array([[1,2,3,4],[5,6,7,8]])
    
    In [13]: for i in a.flat: print(i)
    1
    2
    3
    4
    5
    6
    7
    8
    

    循环 a.flatten() ndarray 并复制数据。

    .flat 它的效率也比 itertools.chain.from_iterable(a) 因为后者涉及到从 A. 作为视图,然后对它们进行迭代——即,许多额外的操作。


    如果你 需要知道指数吗 迭代时,使用 numpy.ndenumerate 而是按照 Iterating over a numpy array

    In [34]: for (x,y),i in np.ndenumerate(a): print("a[%d][%d]=%d"%(x,y,i))
    a[0][0]=1
    a[0][1]=2
    a[0][2]=3
    a[0][3]=4
    a[1][0]=5
    a[1][1]=6
    a[1][2]=7
    a[1][3]=8
    
        2
  •  3
  •   hpaulj    8 年前
    In [333]: a = np.array([[1,2,3,4],[5,6,7,8]])
    In [334]: a
    Out[334]: 
    array([[1, 2, 3, 4],
           [5, 6, 7, 8]])
    

    获取值及其索引的简便方法是 ndenumerate

    In [335]: np.ndenumerate(a)
    Out[335]: <numpy.lib.index_tricks.ndenumerate at 0x7f39160b5160>
    In [336]: list(_)
    Out[336]: 
    [((0, 0), 1),
     ((0, 1), 2),
     ((0, 2), 3),
     ((0, 3), 4),
     ((1, 0), 5),
     ((1, 1), 6),
     ((1, 2), 7),
     ((1, 3), 8)]
    

    它创造了一个 iter = a.flat A. flatiter 对象,然后对其进行迭代,返回 coords next .

    如果您只需要值,而不需要坐标

    In [19]: list(a.flat)
    Out[19]: [1, 2, 3, 4, 5, 6, 7, 8]
    

    ndindex 可用于为给定形状生成索引:

    In [20]: idx=np.ndindex(a.shape)
    In [21]: [(ij, a[ij]) for ij in idx]
    Out[21]: 
    [((0, 0), 1),
     ((0, 1), 2),
     ((0, 2), 3),
     ((0, 3), 4),
     ((1, 0), 5),
     ((1, 1), 6),
     ((1, 2), 7),
     ((1, 3), 8)]
    
        3
  •  3
  •   Paul Panzer    8 年前

    np.nditer :

    >>> a = np.arange(1,9).reshape(2,4)
    >>> b = -a
    >>> 
    >>> it = np.nditer((a, b), order='C', flags=('multi_index',))
    >>> for i, j in it:
    ...     print(it.multi_index, i, j)
    ... 
    (0, 0) 1 -1
    (0, 1) 2 -2
    (0, 2) 3 -3
    (0, 3) 4 -4
    (1, 0) 5 -5
    (1, 1) 6 -6
    (1, 2) 7 -7
    (1, 3) 8 -8
    

    >>> a, b = np.ogrid[1:3, 2:6]
    >>> a.shape, b.shape
    ((2, 1), (1, 4))
    >>> 
    >>> it = np.nditer((a, b), order='C', flags=('multi_index',))
    >>> for i, j in it:
    ...     print(it.multi_index, i, j)
    ... 
    (0, 0) 1 2
    (0, 1) 1 3
    (0, 2) 1 4
    (0, 3) 1 5
    (1, 0) 2 2
    (1, 1) 2 3
    (1, 2) 2 4
    (1, 3) 2 5
    
        4
  •  1
  •   jpp    8 年前

    从您想要的输出 1, 2, ..., 4, 5, ..., 8 ,你可以使用 itertools.chain 要迭代值,请执行以下操作:

    import numpy as np
    from itertools import chain
    
    a = np.array([[1,2,3,4],[5,6,7,8]])
    
    for i in chain.from_iterable(a):
        print(i)
    
    1
    2
    3
    4
    5
    6
    7
    8
    
        5
  •  1
  •   bobrobbob    8 年前

    a = np.array([[1,2,3,4],[5,6,7,8]])
    for row in [0,1]:
        for column in range(4):
            print('a[%s][%s] = %s' % (row, column, a[row][column]))
    

    印刷品:

    a[0][0] = 1
    a[0][1] = 2
    a[0][2] = 3
    a[0][3] = 4
    a[1][0] = 5
    a[1][1] = 6
    a[1][2] = 7
    a[1][3] = 8