Numpy“Fortran”式重塑?
Posted
技术标签:
【中文标题】Numpy“Fortran”式重塑?【英文标题】:Numpy "Fortran"-like reshape? 【发布时间】:2021-01-08 23:36:57 【问题描述】:假设我有一个形状为(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 中执行此操作的最佳方法是什么?
【问题讨论】:
【参考方案1】:与order='F'
reshape 等效的功能:
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]]])
【讨论】:
这些操作都不需要复制数据,这很好。第一个调整形状,第二个跨步。【参考方案2】:您必须设置订单选项:
>>> 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
【讨论】:
【参考方案3】:您需要指定顺序;
X.reshape(3, 2, 2, order='F')
应该有效
【讨论】:
以上是关于Numpy“Fortran”式重塑?的主要内容,如果未能解决你的问题,请参考以下文章