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


    1. matlab的矩阵展平

            matlab的数组展平有两种基本方法,一种是用a(:);另一种是用reshape()函数。代码示例如下:

    1. clear, close all, clc
    2. a = magic(3);
    3. disp(a);
    4. b = a(:);
    5. disp(b');
    6. disp(reshape(a,[],1)'); % matlab会自动计算缺失的参数
    7. disp(reshape(a,1,[])); % matlab会自动计算缺失的参数
    8. fprintf(1,'a(:) size is (%d,%d)\n',size(a(:)));
    9. 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()函数,代码示例如下:

    1. import numpy as np
    2. ##对二维数组进行reval
    3. a=np.reshape([k for k in range(10)], (5,2)) #创建2*2数组
    4. print("二维数组a:", a)
    5. print("np.reshape(a,(1,10)) = ", np.reshape(a,(1,10))) # 仍然得到2维的矩阵
    6. print("np.reshape(a,(10,)) = ", np.reshape(a,(10,))) # 得到1维的向量
    7. print("a.ravel() = ", a.ravel()) # 得到1维的向量
    8. print("a.flatten() = ", a.flatten()) # 得到1维的向量
    9. ##对三维数组进行reval
    10. c=np.empty((2,3,4),dtype=int) #创建2*3*4数组 (两页三行四列)
    11. print("三维数组c:\n", c)
    12. d=np.ravel(c)
    13. 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]的形式,如下所示:

    1. print(c[0])
    2. 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]
    

     

  • 相关阅读:
    【NSRange结构体 Objective-C语言】
    如何高效解决工作上的问题?一站式工单系统有什么用?
    网址分类-杂项
    数据结构学习笔记(二)——栈和队列
    【动手学深度学习】感知机浅记
    涂鸦Wi-Fi&BLE SoC开发幻彩灯带(2)----环境搭建与测试
    碳中和大潮惊涛拍岸,科技企业如何迈入这条大江大河?
    Servlet规范之转发请求
    网站攻击技术,一篇打包带走!
    Node.js 是怎么找到模块的?
  • 原文地址:https://blog.csdn.net/chenxy_bwave/article/details/128045385