我试图找出一个棘手的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中执行此操作的最佳方法是什么?
答案 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]]])