【问题标题】:Numpy "Fortran"-like reshape?Numpy“Fortran”式重塑?
【发布时间】: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 中执行此操作的最佳方法是什么?

【问题讨论】:

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


    【解决方案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')
      

      应该有效

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-23
        • 2019-01-09
        • 2015-05-07
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多