繁体   English   中英

Matlab 与 Python:重塑

[英]Matlab vs Python: Reshape

所以我发现了这个

转换 MATLAB 代码时,可能需要先将矩阵整形为线性序列,执行一些索引操作,然后再整形。 由于 reshape(通常)在同一存储上生成视图,因此应该可以相当有效地执行此操作。

请注意,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:

>> 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 过渡到 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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM