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”式重塑?的主要内容,如果未能解决你的问题,请参考以下文章

numpy.ndenumerate 以 Fortran 顺序返回索引?

numpy 怎么能比我的 Fortran 例程快得多?

将python嵌入fortran 90

可以将 Fortran 数组保存为 .npy 格式吗?

vs 2015写fortran执行后无法输入

检查numpy数组是不是连续?