【问题标题】:Matlab reshape equivalent in PythonMatlab在Python中重塑等价物
【发布时间】:2021-03-13 17:49:52
【问题描述】:

我目前正在将 MATLAB 库移植到 Python。截至目前,我正在努力使代码尽可能一对一。我注意到 Matlab 与 Python 中的 reshape 之间存在一些差异,这会导致一些问题。

我听说人们谈论“C”和“Fortran”顺序的区别。 numpy 如何默认为“C”顺序而 Matlab 使用“Fortran”。下面是两个使用两个命令的 Python 示例。

>>> a = np.arange(12).reshape((2,3,2))
>>> a
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]]])
>>> b = np.arange(12).reshape((2,3,2), order='F')
>>> b
array([[[ 0,  6],
        [ 2,  8],
        [ 4, 10]],

       [[ 1,  7],
        [ 3,  9],
        [ 5, 11]]])

下面是与上述python代码等效的matlab/octave。

octave:12> a = reshape((0:11), [3,2,2])
a =

ans(:,:,1) =

   0   3
   1   4
   2   5

ans(:,:,2) =

    6    9
    7   10
    8   11

请注意,每个示例都会产生不同的结果。

这些示例旨在说明我所指的差异。我在项目中处理的数据集要大得多。我需要能够在 Python 中重塑数组,并确信它正在执行与在 Matlab 中相同的重塑操作。任何帮助将不胜感激。

【问题讨论】:

    标签: python matlab numpy linear-algebra


    【解决方案1】:

    为什么你在一个中使用 (2,3,2) 形状,而在另一个中使用 (3,2,2)?

    In [82]: arr = np.arange(12).reshape((3,2,2), order='F')
    In [83]: arr
    Out[83]: 
    array([[[ 0,  6],
            [ 3,  9]],
    
           [[ 1,  7],
            [ 4, 10]],
    
           [[ 2,  8],
            [ 5, 11]]])
    In [84]: arr[:,:,0]
    Out[84]: 
    array([[0, 3],
           [1, 4],
           [2, 5]])
    In [85]: arr[:,:,1]
    Out[85]: 
    array([[ 6,  9],
           [ 7, 10],
           [ 8, 11]])
    

    ===

    查看进度可能有助于识别cf 订单之间的区别

    In [86]: arr.shape
    Out[86]: (3, 2, 2)
    In [87]: arr.strides
    Out[87]: (8, 24, 48)
    

    注意最小的步骤,1 个元素(8 个字节)在第一维中是如何被采用的。

    C 订单对比:

    In [89]: np.arange(12).reshape(2,2,3)
    Out[89]: 
    array([[[ 0,  1,  2],
            [ 3,  4,  5]],
    
           [[ 6,  7,  8],
            [ 9, 10, 11]]])
    In [90]: np.arange(12).reshape(2,2,3).strides
    Out[90]: (48, 24, 8)
    

    ===

    好的,让我们试试 (2,3,2) 形状:

    >> a = reshape((0:11),[2,3,2])
    a =
    
    ans(:,:,1) =
    
       0   2   4
       1   3   5
    
    ans(:,:,2) =
    
        6    8   10
        7    9   11
    

    与订单“F”相同:

    In [94]: arr = np.arange(12).reshape((2,3,2), order='F')
    In [95]: arr
    Out[95]: 
    array([[[ 0,  6],
            [ 2,  8],
            [ 4, 10]],
    
           [[ 1,  7],
            [ 3,  9],
            [ 5, 11]]])
    In [96]: arr[:,:,0]
    Out[96]: 
    array([[0, 2, 4],
           [1, 3, 5]])
    
    >> squeeze(a(1,:,:))
    ans =
    
        0    6
        2    8
        4   10
    In [98]: arr[0,:,:]
    Out[98]: 
    array([[ 0,  6],
           [ 2,  8],
           [ 4, 10]])
    

    【讨论】:

    • np.arange(12).reshape(2,3,2) 在 Python 中产生的结果与在 matlab 中的 reshape((0:11),[2,3,2]) 不同。这是由于两种语言之间的索引差异。对于 3 维数组,在 Python 中为 arr[z,y,x],在 Matlab 中为 arr(y,x,z)
    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 2016-09-18
    • 2018-05-29
    • 2020-02-13
    • 2015-07-17
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    相关资源
    最近更新 更多