如何为numpy数组返回columnmajor迭代器?

2024-06-06 00:16:53 发布

您现在位置:Python中文网/ 问答频道 /正文

numpy中的ndarray对象有一个flat属性(例如array.flat),允许遍历其元素。例如:

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

但是,如何返回列主1D迭代器,以便上面的示例返回5而不是4?你知道吗


Tags: 对象numpy元素示例属性nparrayndarray
2条回答

进近#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

这里没有任何复制、展平或散乱,只使用索引,因此在内存和性能方面都应该是有效的。你知道吗

不确定这是不是最好的方法,但似乎很简单

array.T.flat

会给出我想要的结果。尽管我希望有一些合适的方法,我可以用order='F'来指定,这将更容易理解。你知道吗

相关问题 更多 >