ndarray
numpy
中的对象有一个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
?
ndarray
numpy
中的对象有一个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
?
不知道这是最好的方式,但似乎只是
array.T.flat
会给我正在寻找的结果。虽然我希望有一些适当的方法,我可以用order='F'
来指定,一眼就可以更容易理解。
方法#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在这里变得平坦或散乱,并且仅使用索引,因此在内存和性能方面应该是有效的。
尽管如此,它还是构建了整个数组的副本。 ('ravel'只会在需要的时候复制,但是如果你这样使用它,需要这样做。) – user2357112
@ user2357112感谢您指出!在它上面添加了注释。 – Divakar
这非常干净和高效。 – user2357112
Second @ user2357112的评论。这种方法看起来非常有效。 – Divakar