我目前正在将一个MATLAB库移植到Python上。到目前为止,我正在尝试尽可能地保持代码的一对一。我注意到Matlab中的reshape和Python之间的一些差异,这导致了一些问题。
我听过人们谈论“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中相同的重塑操作。任何帮助都将不胜感激。
发布于 2020-12-02 03:12:42
为什么在一个中使用(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]])===
纵观大步,可能有助于识别c和f订单之间的差异
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]])https://stackoverflow.com/questions/65096742
复制相似问题