【问题标题】:Matlab vs Python: ReshapeMatlab vs Python:重塑
【发布时间】:2012-08-07 04:57:14
【问题描述】:

于是我找到了this

在转换 MATLAB 代码时,可能需要先重塑 矩阵到线性序列,执行一些索引操作,然后 重塑回来。由于重塑(通常)会产生相同的视图 存储,应该可以相当有效地做到这一点。

请注意,Numpy 中 reshape 使用的扫描顺序默认为 'C' 顺序,而 MATLAB 使用 Fortran 顺序。如果你只是 转换为线性序列并返回这并不重要。但如果 您正在从依赖于扫描的 MATLAB 代码转换重塑 顺序,然后这个 MATLAB 代码:

z = reshape(x,3,4);

应该变成

z = x.reshape(3,4,order='F').copy()

在 Numpy 中。

当我在 MATLAB 中做时,我有一个名为 mafs 的多维 16*2 数组:

mafs2 = reshape(mafs,[4,4,2]) 

我得到的东西与我在 python 中所做的不同:

mafs2 = reshape(mafs,(4,4,2))

甚至

mafs2 = mafs.reshape((4,4,2),order='F').copy()

对此有任何帮助吗?谢谢大家。

【问题讨论】:

  • 您能否为没有 MATLAB 可供测试的人发布一些示例输入和所需的 (MATLAB) 输出?
  • 我会指出 reshape(mafs,(4,4,2)) 将是一个语法错误,而 reshape(mafs,[4,4,2]) 不是。

标签: python matlab matrix numpy scipy


【解决方案1】:

我自己也有类似的问题,因为我也在尝试从 MATLAB 过渡到 Python。我终于能够将一个以深度、行、列、格式给出的 numpy 矩阵转换为单张列向量(每张图像)。

在 MATLAB 中我会做类似的事情:

output = reshape(imStack,[row*col,depth])

在 Python 中,这似乎转换为:

import numpy as np
output=np.transpose(imStack)
output=output.reshape((row*col, depth), order='F')

【讨论】:

    【解决方案2】:

    例子:

    MATLAB:

    >> mafs = [(1:16)' (17:32)']
    mafs =
         1    17
         2    18
         3    19
         4    20
         5    21
         6    22
         7    23
         8    24
         9    25
        10    26
        11    27
        12    28
        13    29
        14    30
        15    31
        16    32
    
    >> reshape(mafs,[4 4 2])
    ans(:,:,1) =
         1     5     9    13
         2     6    10    14
         3     7    11    15
         4     8    12    16
    ans(:,:,2) =
        17    21    25    29
        18    22    26    30
        19    23    27    31
        20    24    28    32
    

    Python:

    >>> import numpy as np
    >>> mafs = np.c_[np.arange(1,17), np.arange(17,33)]
    >>> mafs.shape
    (16, 2)
    >>> mafs[:,0]
    array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16])
    >>> mafs[:,1]
    array([17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32])
    
    >>> r = np.reshape(mafs, (4,4,2), order="F")
    >>> r.shape
    (4, 4, 2)
    >>> r[:,:,0]
    array([[ 1,  5,  9, 13],
           [ 2,  6, 10, 14],
           [ 3,  7, 11, 15],
           [ 4,  8, 12, 16]])
    >>> r[:,:,1]
    array([[17, 21, 25, 29],
           [18, 22, 26, 30],
           [19, 23, 27, 31],
           [20, 24, 28, 32]])
    

    【讨论】:

    • 所以matlab的reshape函数总是使用fortran顺序。要在 python 中获得等效的整形输出,我们需要 order='F' 参数。对吗???
    • MATLAB 数组存储在column-major order 中(无论是二维矩阵还是二维以上的数组)。 RESHAPE 函数返回一个副本,其元素保留其列顺序,仅更改新数组的“形状”。相应的 Numpy 函数允许您指定所需的顺序(C 或 Fortran 顺序,C 为默认值)。如果你想在 MATLAB 中做同样的事情,除了 RESHAPE 之外,你还需要 PERMUTE。
    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 2016-01-21
    • 2016-04-22
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多