【问题标题】:Iterate over numpy array columnwise逐列迭代numpy数组
【发布时间】:2016-02-19 19:24:57
【问题描述】:

np.nditer 自动逐行迭代数组的元素。有没有办法逐列迭代数组的元素?

x = np.array([[1,3],[2,4]])

for i in np.nditer(x):
    print i

# 1
# 3
# 2
# 4

我想要的是:

for i in Columnwise Iteration(x):
    print i
# 1
# 2
# 3
# 4

我最好的选择是在进行迭代之前转置我的数组吗?

【问题讨论】:

  • “我最好的选择是……转置……吗?”也许您可以解释一下上下文 - 为什么您想遍历所有列?根据答案,转置可能是合理的还是不合理的,并且可能不需要迭代。
  • @AmiTavory 我需要根据数组中每个单元格的索引将值填充到数组中。解释起来有点复杂,但我想按列而不是按行进行迭代,以匹配 R 中存在的类似函数,其中对矩阵的迭代默认按列进行。

标签: python numpy


【解决方案1】:

为了完整起见,您不必在遍历元素之前转置矩阵。使用np.nditer,您可以指定如何遍历矩阵的顺序。默认值通常是 row-major 或 C-like order。您可以覆盖此行为并选择列主要或 FORTRAN-like 顺序,这是您想要的。使用np.nditer时,只需指定一个附加参数order并将此标志设置为'F'

In [16]: x = np.array([[1,3],[2,4]])

In [17]: for i in np.nditer(x,order='F'):
   ....:     print i
   ....:     
1
2
3
4

您可以在此处阅读有关如何控制迭代顺序的更多信息:http://docs.scipy.org/doc/numpy-1.10.0/reference/arrays.nditer.html#controlling-iteration-order

【讨论】:

  • doc 页面对于任何尝试使用 nditer 的人来说都是必须的。但是,如果您想提高速度(与常规数组迭代相比),请一直研究到最后。
  • @hpaulj 当然:)!
【解决方案2】:

您可以使用形状并对每一列进行切片

>>> [x[:, i] for i in range(x.shape[1])]
[array([1, 2]), array([3, 4])]

【讨论】:

    【解决方案3】:

    你可以转置它吗?

    >>> x = np.array([[1,3],[2,4]])
    >>> [y for y in x.T]
    [array([1, 2]), array([3, 4])]
    

    或者不太优雅:

    >>> [np.array([x[j,i] for j in range(x.shape[0])]) for i in range(x.shape[1])]
    [array([1, 2]), array([3, 4])]
    

    【讨论】:

    • 没关系。它发生了。我要抹去我的cmets。
    【解决方案4】:

    nditer 不是这种情况下最好的迭代工具。它在致力于编译(cython)解决方案时很有用,但在纯 Python 编码中则不然。

    看一些常规的迭代策略:

    In [832]: x=np.array([[1,3],[2,4]])
    
    In [833]: x
    Out[833]: 
    array([[1, 3],
           [2, 4]])
    
    In [834]: for i in x:print i   # print each row
    [1 3]
    [2 4]
    
    In [835]: for i in x.T:print i   # print each column
    [1 2]
    [3 4]
    
    In [836]: for i in x.ravel():print i   # print values in order
    1
    3
    2
    4
    
    In [837]: for i in x.T.ravel():print i  # print values in column order
    1
    2
    3
    4
    

    你评论:I need to fill values into an array based on the index of each cell in the array

    index 是什么意思?

    带有索引的粗略 2d 迭代:

    In [838]: for i in range(2):
       .....:     for j in range(2):
       .....:         print (i,j),x[i,j]
    (0, 0) 1
    (0, 1) 3
    (1, 0) 2
    (1, 1) 4
    

    ndindex 使用nditer 生成相似索引

    In [841]: for i,j in np.ndindex(x.shape):
       .....:     print (i,j),x[i,j]
       .....:     
    (0, 0) 1
    (0, 1) 3
    (1, 0) 2
    (1, 1) 4
    

    enumerate 是一种很好的 Python 获取值和索引的方法:

    In [847]: for i,v in enumerate(x):print i,v
    0 [1 3]
    1 [2 4]
    

    或者您可以使用meshgrid 将所有索引生成为数组

    In [843]: I,J=np.meshgrid(range(2),range(2))
    
    In [844]: I
    Out[844]: 
    array([[0, 1],
           [0, 1]])
    
    In [845]: J
    Out[845]: 
    array([[0, 0],
           [1, 1]])
    
    In [846]: x[I,J]
    Out[846]: 
    array([[1, 2],
           [3, 4]])
    

    请注意,大多数这些迭代方法只是将您的数组视为列表列表。它们没有利用数组性质,并且与使用整个 x 的方法相比会很慢。

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 2013-05-05
      • 2011-10-03
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多