matlab的数组展平有两种基本方法,一种是用a(:);另一种是用reshape()函数。代码示例如下:
- clear, close all, clc
-
- a = magic(3);
- disp(a);
- b = a(:);
- disp(b');
-
- disp(reshape(a,[],1)'); % matlab会自动计算缺失的参数
- disp(reshape(a,1,[])); % matlab会自动计算缺失的参数
-
- fprintf(1,'a(:) size is (%d,%d)\n',size(a(:)));
-
- fprintf(1,"1's size is (%d,%d)\n",size(1));
运行结果如下:
8 1 6
3 5 7
4 9 28 3 4 1 5 9 6 7 2
8 3 4 1 5 9 6 7 2
8 3 4 1 5 9 6 7 2
a(:) size is (9,1)
1's size is (1,1)
要点:
(1) matlab是按列优先进行展平。matlab中是以列作为第1维,行作为第2维,将矩阵展平时,
先把第一列取出来,然后取第二列排在第一列后面,然后以此类推。。。
(2) matlab本质上把所有标量、向量和矩阵都是当作矩阵(2维数组来看待)。比如说以上代码中即便常数1的size也是(1,1)。所以即便将矩阵展平了其实得到的还是一个矩阵,只是矩阵的两个维度方向的长度发生的变化。这点与numpy中的张量的处理是不同的,如下面所述。
matlab中如何处理2维以上的数组呢?待补充。
numpy中对于多维数组的处理要比matlab中的矩阵处理要更为灵活(其中原因可能是matlab一开始就是面向矩阵运算开发的,更高维数组的处理是后来扩充的,不是原生的高维数组处理方式;而numpy自一开始就是面向通用的张量处理而开发的,是原生的处理方式)。
numpy中将多维数组进行展平可以使用flatten()函数或者ravel()函数,也可以用与matlab同名的reshape()函数,代码示例如下:
- import numpy as np
- ##对二维数组进行reval
- a=np.reshape([k for k in range(10)], (5,2)) #创建2*2数组
- print("二维数组a:", a)
- print("np.reshape(a,(1,10)) = ", np.reshape(a,(1,10))) # 仍然得到2维的矩阵
- print("np.reshape(a,(10,)) = ", np.reshape(a,(10,))) # 得到1维的向量
-
- print("a.ravel() = ", a.ravel()) # 得到1维的向量
- print("a.flatten() = ", a.flatten()) # 得到1维的向量
-
-
- ##对三维数组进行reval
- c=np.empty((2,3,4),dtype=int) #创建2*3*4数组 (两页三行四列)
- print("三维数组c:\n", c)
-
- d=np.ravel(c)
- print("对c进行reval操作后:\n",d)
运行结果如下所示:
二维数组a: [[0 1] [2 3] [4 5] [6 7] [8 9]] np.reshape(a,(1,10)) = [[0 1 2 3 4 5 6 7 8 9]] np.reshape(a,(10,)) = [0 1 2 3 4 5 6 7 8 9] a.ravel() = [0 1 2 3 4 5 6 7 8 9] a.flatten() = [0 1 2 3 4 5 6 7 8 9] 三维数组c: [[[-1045352360 640 49 0] [ 0 0 0 0] [ 0 7209071 1852990827 1630432357]] [[ 1714764086 758396724 1698063458 876164141] [ 859319653 1663906615 875640624 1633826099] [ 775250739 1869771365 114 7471204]]] 对c进行reval操作后: [-1045352360 640 49 0 0 0 0 0 0 7209071 1852990827 1630432357 1714764086 758396724 1698063458 876164141 859319653 1663906615 875640624 1633826099 775250739 1869771365 114 7471204]
要点:
(1) numpy的ravel()和flatten()将任意高维数组都展平为1维数组(更加符合展平的自然含义)
(2) numpy.reshape()与matlab.reshape()的功能相同,都是任意改变数组形状。因此也可以用它实现ravel()和flatten()的功能
(3) numpy中对多维数组的展平是由内而外的。即先展平内层,然后向外延申。numpy中的高维数组中每个维度方向称为轴(axis),第0个轴为最外层的轴,轴的序号由外到内从低到高。多维数组可以看作是一个递归的过程。以以上代码中3维数组(更标准的说法是3阶张量)的展开为例:先展开c[0],然后展开c[1],连接c[0]的展开和c[1]的展开得到c的展开;然后,c[0]和c[1](均为2阶张量,2为数组)的展开同理,比如说,c[0]的展开是c[0][0]、c[0][1]、c[0][2]的展开按顺序连接构成。
注意,numpy中多维数组的元素的引用既可以用c[0][0]的形式也可以用c[0,0]的形式,如下所示:
- print(c[0])
- print(c[0][0], c[0,0])
[[-1045352360 640 49 0] [ 0 0 0 0] [ 0 7209071 1852990827 1630432357]] [-1045352360 640 49 0] [-1045352360 640 49 0]