MATLAB和Python中的整形和索引

MATLAB和Python中的整形和索引,python,arrays,matlab,reshape,tensor,Python,Arrays,Matlab,Reshape,Tensor,我有一个Matlab代码,需要用Python翻译。这里的一点是,形状和索引非常重要,因为它与张量一起工作。我有点困惑,因为在python中使用order='F'似乎就足够了。但当我处理3D数据时,我注意到它不起作用。例如,如果A是python中从1到27的数组 array([[[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]], [[10, 11, 12], [13, 14, 15],

我有一个Matlab代码,需要用Python翻译。这里的一点是,形状和索引非常重要,因为它与张量一起工作。我有点困惑,因为在python中使用
order='F'
似乎就足够了。但当我处理3D数据时,我注意到它不起作用。例如,如果
A
是python中从1到27的数组

array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],

       [[10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]],

       [[19, 20, 21],
        [22, 23, 24],
        [25, 26, 27]]])
如果我执行
A.重塑(3,9,order='F')
我得到

[[ 1  4  7  2  5  8  3  6  9]
 [10 13 16 11 14 17 12 15 18]
 [19 22 25 20 23 26 21 24 27]]
在Matlab for
A=1:27
中,重塑为[3,3,3],然后是[3,9],似乎我得到了另一个数组:

1     4     7    10    13    16    19    22    25
2     5     8    11    14    17    20    23    26
3     6     9    12    15    18    21    24    27

Matlab和Python中的SVD给出了不同的结果。那么,有没有办法解决这个问题

也许你知道在Matlab->python中操作多维数组的正确方法,比如我应该为arange(1,13)等数组获得相同的SVD吗?重塑(3,4)和Matlab 1:12->重塑(uz,[3,4]),或者正确的方法是什么?也许我可以在python中以某种方式交换轴,以获得与Matlab相同的结果?或者在Python中更改
重塑(x1,x2,x3,…)
中的轴顺序

Matlab中的

A = 1:27;
A = reshape(A,3,3,3);
B = reshape(A,9,3)'
B =

     1     2     3     4     5     6     7     8     9
    10    11    12    13    14    15    16    17    18
    19    20    21    22    23    24    25    26    27
size(B)

ans =

     3     9
用Python

A = np.array(range(1,28))
A = A.reshape(3,3,3)
B = A.reshape(3,9)
B
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18],
       [19, 20, 21, 22, 23, 24, 25, 26, 27]])
np.shape(B)
 (3, 9)

我也有同样的问题,直到我找到这篇维基百科文章:

Python(和C)按行的主要顺序组织数据数组。正如您在第一个示例代码中看到的,元素首先随列增加:

array([[[ 1,  2,  3],
          - - - -> increasing
然后排成一排

array([[[ 1,  2,  3],
      [ 4,   <--- new element
(在matlab中)

load('A.mat')
A=排列(A[3 2 1]);%反序尺寸
整形(A,9,3)“%给出的结果与python中的A.reformate([3,9])相同

请注意,(9,3)和(3,9)是有意按相反的顺序排列的。

在Matlab
中重塑(A,3,3,3)
给出与初始Python数组相同的结果。在Matlab
A=1:27
中相当于
A=np。数组(范围(1,28))
在Python中。在Matlab中,整形(A,3,3,3)与Python中的整形(3,3,3)是等价的。但是,如果我想将(3,3,3)数组重塑为(3,9),该怎么办?似乎元素的顺序不同,非常感谢您的解释!那么,从Matlab到python的“翻译”代码的正确方法是什么呢?在Matlab中,我们有
重塑(A,[x1,x2,x3,…])
那么在python中,它应该是
A.重塑(…,x3,x2,x1)
对吗?如果张量A是在python中创建的,是的。如果要将首先在matlab中创建的张量导入python(或反之亦然),则首先需要排列其维度(matlab中的
permute()
,python中的
np.moveaxis()
),然后按照您提到的方式进行重塑。
array([[[ 1,  2,  3],
    [ 4,  5,  6],
    [ 7,  8,  9]],

   [[10,  <-- new element in next page