在Python和MATLAB中,您都可以使用名为reshape()
的函数来更改矩阵的尺寸。
这是线性代数中的什么运算,是基数的变化,还是更简单的矩阵乘法?还是两者都不是?
答案 0 :(得分:3)
此函数与线性代数无关,它是一个简单的索引技巧。考虑以下内容(我将使用MATLAB syntax,但在Python中,尤其是使用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,按列优先顺序排列。重塑时,将保留线性样式,仅对其进行重新排序。线性地,您的元素以1 4 2 5 3 6
的升序排列,它们存储在连续的内存中。排序的“标题”告诉程序这些相邻元素的形状。这就是reshape
几乎免费的原因:它仅更改标题。
线性代数与此无关,这只是使某些编程任务更容易的数字技巧。
有关MATLAB中的索引如何工作的更多信息,建议使用this great Q/A。
在底层,MATLAB使用sub2ind()
将A(2:2)
转换为A(4)
,即第四线性索引,正是因为所有内容都存储为线性向量。重塑的全部目的是告诉标头元素3不再位于A(1,2)
,而是因为其外观已更改为A(3,1)
。
答案 1 :(得分:1)
根据python文档 1,2,它只是使数组散乱(因此使ta为线性一维向量。然后使用索引,将其返回到定义大小的新数组。例如:
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)]
答案 2 :(得分:0)
您可以重塑的最简单的矩阵是 2x2,但您会明白的。 (抱歉,StackOverflow 不允许我插入图像或 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)
矩阵。