numpy和matlab的多维数组展平:ravel, flatten, reshape, (:)

本文对比了MATLAB和NumPy中数组展平和重塑的方法,探讨了两者在处理多维数组时的区别。MATLAB通过a(:)和reshape函数实现展平,遵循列优先原则,而NumPy的ravel()和flatten()函数能将任意高维数组展平为一维,并且reshape()功能更强大,支持多维数组的灵活重塑。在NumPy中,展平过程是从内层到外层依次进行的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. matlab的矩阵展平

        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     2

     8     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维以上的数组呢?待补充。

2. numpy flatten(), ravel(), reshape()

        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]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨牛慢耕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值