类Fortran的Numpy重塑?

5

假设我有一个形状为(6, 2)的数组X,就像这样:

import numpy as np
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]])

我想将它重塑为形状为(3, 2, 2)的数组,因此我这样做了:
X.reshape(3, 2, 2)

并获得:

array([[[ 1,  2],
        [ 3,  4]],

       [[ 5,  6],
        [ 7,  8]],

       [[ 9, 10],
        [11, 12]]])

然而,我需要以不同的格式呈现我的数据。确切地说,我希望最终得到:

array([[[ 1,  2],
        [ 7,  8]],

       [[ 3,  4],
        [ 9,  10]],

       [[ 5, 6],
        [11, 12]]])

我应该使用reshape还是其他方法?在Numpy中最好的方法是什么?

3个回答

5

您需要设置订单选项:

>>> X.reshape(3, 2, 2, order='F')
array([[[ 1,  2],
        [ 7,  8]],

       [[ 3,  4],
        [ 9, 10]],

       [[ 5,  6],
        [11, 12]]])

‘F’表示按照Fortran式的索引顺序读取/写入元素,第一个索引变化最快,最后一个索引变化最慢。
参见:https://numpy.org/doc/stable/reference/generated/numpy.reshape.html

4

您需要指定顺序;

X.reshape(3, 2, 2, order='F')

应该能正常工作


4

order='F'重塑功能相同:

In [31]: x.reshape(2,3,2).transpose(1,0,2)
Out[31]: 
array([[[ 1,  2],
        [ 7,  8]],

       [[ 3,  4],
        [ 9, 10]],

       [[ 5,  6],
        [11, 12]]])

In [32]: x.reshape(2,3,2).transpose(1,0,2).strides
Out[32]: (16, 48, 8)

没有转置,步长将是(48, 16, 8)。 这个布局有点棘手的一点是最后一个维度保持'C'顺序。只有前两个维度被交换了。 完整的'F'布局将是:
In [33]: x = np.arange(1,13).reshape(3,2,2,order='F')
In [34]: x
Out[34]: 
array([[[ 1,  7],
        [ 4, 10]],

       [[ 2,  8],
        [ 5, 11]],

       [[ 3,  9],
        [ 6, 12]]])

1
这些操作都不需要复制数据,这很好。第一个调整形状,第二个调整步幅。 - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接