reshape 执行什么数学函数?
What mathematical function does reshape perform?
在 Python 和 MATLAB 中,您都可以使用名为 reshape()
的函数来更改矩阵的维度。
这是线性代数中的什么运算,这是基的变化,还是更简单的矩阵乘法,或者两者都不是?
这个函数与线性代数无关,它是一个简单的索引技巧。考虑以下(我将使用 MATLAB syntax, but in Python, especially using NumPy/SciPy,它的功能相同):
A = [1 2 3; 4 5 6]; % 2-by-3 matrix
B = reshape(A,3,2); % B is 3-by-2
B =
1 5
4 3
2 6
所以实际上您在 A
中有 6 个索引:1 到 6,顺序为 column-major。重塑时,保持线性风格,只是重新排序。线性地,您的元素按升序排列:1 4 2 5 3 6
,它们存储在连续的内存中。 'header' 之类的告诉程序这些连续元素是如何形成的。这就是为什么 reshape
几乎是免费的:它只改变了 header.
线性代数与此无关,这只是使某些编程任务更容易的数值技巧。
有关 MATLAB 中索引如何工作的更多信息,我推荐 this great Q/A。
在引擎盖下,MATLAB 将 A(2,2)
转换为 A(4)
,即第四个线性索引,使用 sub2ind()
,正是因为所有内容都存储为线性向量。重塑所做的只是告诉 header 元素 3 不再位于 A(1,2)
,而是更改为 A(3,1)
,因为它的外观发生了变化。
根据 python 文档 1,2,它只是拼凑数组(因此使 t 成为线性一维向量。然后,使用索引,它返回到定义大小的新数组。例如:
start_array =
[1,2,3,4;
5,6,7,8;
9,10,11,12]
i_a = [1,2,3,4,5,6,7,8,9,10,11,12] %implicit, not visible for user
result_array =
[i_a(1), i_a(6), i_a(11);
i_a(5), i_a(10), i_a(4);
i_a(9), i_a(3), i_a(8);
i_a(2), i_a(7), i_a(12)]
您可以重塑的最简单矩阵是 2x2,但您会明白的。 (抱歉,Whosebug 不允许我插入图片或 LaTex,因此,您需要稍微吃点苦头才能阅读。)
我们从 A=[[a,b],[c,d]]
开始,我们想将其重新整形为 1x4 数组:[[a,b,c,d]]
。你可以用代数的方式做到这一点:
[[1,0]] * A * [[1,0,0,0],[0,0,0,0]] +
[[1,0]] * A * [[0,0,0,0],[0,1,0,0]] +
[[0,1]] * A * [[0,0,1,0],[0,0,0,0]] +
[[0,1]] * A * [[0,0,0,0],[0,0,0,1]]
*
表示矩阵乘法。
每一项都是一致矩阵的乘积:1x2 * 2x2 * 2x4
得到形状为 1x4
.
的结果
第一学期给你 [[a,0,0,0]]
,第二学期 [[0,b,0,0]]
,第三学期 [[0,0,c,0]]
和第四学期 [[0,0,0,d]]
.
将其推广到形状为 nxm
的任意 A 应该不会太难。您将需要 n*m
个项而不是 4 个项,因为您的重塑矩阵将为 1x(n*m)
。每个术语都需要一致,因此,您需要一个形状为 1xn
的矩阵从左侧击中 A,并需要一个形状为 mx(n*m)
的矩阵从右侧击中 A。
如果您需要将形状为 nxm
的 A 重塑为形状 kxl
,其中 k*l=n*m
,您需要使用 kxn
从左侧击中 A矩阵,从右边开始有 mx(k*l)
个矩阵。
在 Python 和 MATLAB 中,您都可以使用名为 reshape()
的函数来更改矩阵的维度。
这是线性代数中的什么运算,这是基的变化,还是更简单的矩阵乘法,或者两者都不是?
这个函数与线性代数无关,它是一个简单的索引技巧。考虑以下(我将使用 MATLAB syntax, but in Python, especially using NumPy/SciPy,它的功能相同):
A = [1 2 3; 4 5 6]; % 2-by-3 matrix
B = reshape(A,3,2); % B is 3-by-2
B =
1 5
4 3
2 6
所以实际上您在 A
中有 6 个索引:1 到 6,顺序为 column-major。重塑时,保持线性风格,只是重新排序。线性地,您的元素按升序排列:1 4 2 5 3 6
,它们存储在连续的内存中。 'header' 之类的告诉程序这些连续元素是如何形成的。这就是为什么 reshape
几乎是免费的:它只改变了 header.
线性代数与此无关,这只是使某些编程任务更容易的数值技巧。
有关 MATLAB 中索引如何工作的更多信息,我推荐 this great Q/A。
在引擎盖下,MATLAB 将 A(2,2)
转换为 A(4)
,即第四个线性索引,使用 sub2ind()
,正是因为所有内容都存储为线性向量。重塑所做的只是告诉 header 元素 3 不再位于 A(1,2)
,而是更改为 A(3,1)
,因为它的外观发生了变化。
根据 python 文档 1,2,它只是拼凑数组(因此使 t 成为线性一维向量。然后,使用索引,它返回到定义大小的新数组。例如:
start_array =
[1,2,3,4;
5,6,7,8;
9,10,11,12]
i_a = [1,2,3,4,5,6,7,8,9,10,11,12] %implicit, not visible for user
result_array =
[i_a(1), i_a(6), i_a(11);
i_a(5), i_a(10), i_a(4);
i_a(9), i_a(3), i_a(8);
i_a(2), i_a(7), i_a(12)]
您可以重塑的最简单矩阵是 2x2,但您会明白的。 (抱歉,Whosebug 不允许我插入图片或 LaTex,因此,您需要稍微吃点苦头才能阅读。)
我们从 A=[[a,b],[c,d]]
开始,我们想将其重新整形为 1x4 数组:[[a,b,c,d]]
。你可以用代数的方式做到这一点:
[[1,0]] * A * [[1,0,0,0],[0,0,0,0]] +
[[1,0]] * A * [[0,0,0,0],[0,1,0,0]] +
[[0,1]] * A * [[0,0,1,0],[0,0,0,0]] +
[[0,1]] * A * [[0,0,0,0],[0,0,0,1]]
*
表示矩阵乘法。
每一项都是一致矩阵的乘积:1x2 * 2x2 * 2x4
得到形状为 1x4
.
第一学期给你 [[a,0,0,0]]
,第二学期 [[0,b,0,0]]
,第三学期 [[0,0,c,0]]
和第四学期 [[0,0,0,d]]
.
将其推广到形状为 nxm
的任意 A 应该不会太难。您将需要 n*m
个项而不是 4 个项,因为您的重塑矩阵将为 1x(n*m)
。每个术语都需要一致,因此,您需要一个形状为 1xn
的矩阵从左侧击中 A,并需要一个形状为 mx(n*m)
的矩阵从右侧击中 A。
如果您需要将形状为 nxm
的 A 重塑为形状 kxl
,其中 k*l=n*m
,您需要使用 kxn
从左侧击中 A矩阵,从右边开始有 mx(k*l)
个矩阵。