首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的Matlab重塑等效项

Python中的Matlab重塑等效项
EN

Stack Overflow用户
提问于 2020-12-02 02:52:49
回答 1查看 67关注 0票数 0

我目前正在将一个MATLAB库移植到Python上。到目前为止,我正在尝试尽可能地保持代码的一对一。我注意到Matlab中的reshape和Python之间的一些差异,这导致了一些问题。

我听过人们谈论“C”和“Fortran”顺序的区别。如何numpy默认为'C‘顺序,Matlab使用'Fortran’。下面是使用这两种顺序的两个Python示例。

代码语言:javascript
复制
>>> 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。

代码语言:javascript
复制
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中相同的重塑操作。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2020-12-02 03:12:42

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

代码语言:javascript
复制
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订单之间的差异

代码语言:javascript
复制
In [86]: arr.shape
Out[86]: (3, 2, 2)
In [87]: arr.strides
Out[87]: (8, 24, 48)

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

将其与C订单进行对比:

代码语言:javascript
复制
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)形状:

代码语言:javascript
复制
>> 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’相同:

代码语言:javascript
复制
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]])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65096742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档