脾气暴躁的重塑?

时间:2020-09-22 19:34:47

标签: python arrays python-3.x numpy numpy-ndarray

我试图找出一个棘手的Numpy重塑问题。我尝试将其尽可能地煮沸。

假设我有一个形状为X的数组(6, 2),如下所示:

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 个答案:

答案 0 :(得分:4)

您必须设置订购选项:

>>> 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

答案 1 :(得分:4)

您需要指定订单;

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

应该工作

答案 2 :(得分: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]]])