2017-04-26 74 views
2

ndarraynumpy中的对象有一个flat属性(例如array.flat),允许用户遍历其元素。例如:如何返回numpy数组的列主迭代器?

>>> x = np.arange(1, 7).reshape(2, 3) 
>>> x 
array([[1, 2, 3], 
     [4, 5, 6]]) 
>>> x.flat[3] 
4 

但我怎么能返回列主要的一维迭代,从而使上面的例子返回5代替4

回答

2

不知道这是最好的方式,但似乎只是

array.T.flat 

会给我正在寻找的结果。虽然我希望有一些适当的方法,我可以用order='F'来指定,一眼就可以更容易理解。

+1

这非常干净和高效。 – user2357112

+0

Second @ user2357112的评论。这种方法看起来非常有效。 – Divakar

1

方法#1

您可以使用.ravel('F')有列优先的顺序,然后指数 -

x.ravel('F')[3] 

采样运行 -

In [100]: x 
Out[100]: 
array([[1, 2, 3], 
     [4, 5, 6]]) 

In [101]: x.ravel('F')[3] 
Out[101]: 5 

这将创建的副本整个阵列在选择元素之前 -

In [161]: np.may_share_memory(x, x.ravel()) 
Out[161]: True 

In [162]: np.may_share_memory(x, x.ravel('F')) 
Out[162]: False 

因此,这可能不是最有记忆效率的。为了更好的,让我们转到另一种方法。


方法2

我们可以从列主序索引中的行和列索引,然后简单地指数与它的阵列 -

x[np.unravel_index(3, np.array(x.shape)[::-1])] 

采样运行 -

In [147]: x 
Out[147]: 
array([[1, 2, 3], 
     [4, 5, 6]]) 

In [148]: idx = np.unravel_index(3, np.array(x.shape)[::-1]) 

In [149]: idx 
Out[149]: (1, 1) # row, col indices obtained in C order 

In [150]: x[idx] 
Out[150]: 5 

没有任何复制o r在这里变得平坦或散乱,并且仅使用索引,因此在内存和性能方面应该是有效的。

+0

尽管如此,它还是构建了整个数组的副本。 ('ravel'只会在需要的时候复制,但是如果你这样使用它,需要这样做。) – user2357112

+0

@ user2357112感谢您指出!在它上面添加了注释。 – Divakar