在机器学习以及深度学习的任务中,通常需要将处理好的数据以模型能接收的格式输入给模型,然后由模型通过一系列的运算,最终返回一个处理结果。然而,由于不同模型所接收的输入格式不一样,往往需要先对其进行一系列的变形和运算,从而将数据处理成符合模型要求的格式。

在矩阵或者数组的运算中,经常会遇到需要把多个向量或矩阵按某轴方向合并,或展平(如在卷积或循环神经网络中,在全连接层之前,需要把矩阵展平)的情况。下面介绍几种常用的数组变形方法。

修改指定数组的形状是 NumPy 中最常见的操作之一,常见的方法有很多,下表列出了一些常用函数和属性。

表1:Numpy 中改变向量形状的一些函数和属性

函数/属性

描述

arr.reshape()

重新将向量 arr 维度进行改变,不修改向量本身

arr.resize()

重新将向量 arr 维度进行改变,修改向量本身

arr.T

对向量 arr 进行转置

arr.ravel()

对向量 arr 进行展平,即将多维数组变成1维数组,不会产生原数组的副本

arr.flatten()

对向量 arr 进行展平,即将多维数组变成1维数组,返回原数组的副本

arr.squeeze()

只能对维数为1的维度降维。对多维数组使用时不会报错,但是不会产生任何影响

arr.transpose()

对高维矩阵进行轴对换

下面来看一些示例。

reshape() 函数

reshape() 函数用来改变向量的维度(不修改向量本身),请看下面的代码:

import numpy as np

arr =np.arange(10)

print(arr)

# 将向量 arr 维度变换为2行5列

print(arr.reshape(2, 5))

# 指定维度时可以只指定行数或列数, 其他用 -1 代替

print(arr.reshape(5, -1))

print(arr.reshape(-1, 5))

输出结果:

[0 1 2 3 4 5 6 7 8 9]

[[0 1 2 3 4]

[5 6 7 8 9]]

[[0 1]

[2 3]

[4 5]

[6 7]

[8 9]]

[[0 1 2 3 4]

[5 6 7 8 9]]

值得注意的是,reshape() 函数不支持指定行数或列数,所以 -1 在这里是必要的。且所指定的行数或列数一定要能被整除,例如上面代码如果修改为 arr.reshape(3,-1) 即为错误的。

resize() 函数

resize() 函数用来改变向量的维度(修改向量本身),请看下面的代码:

import numpy as np

arr =np.arange(10)

print(arr)

# 将向量 arr 维度变换为2行5列

arr.resize(2, 5)

print(arr)

输出结果:

[0 1 2 3 4 5 6 7 8 9]

[[0 1 2 3 4]

[5 6 7 8 9]]

T 属性

T 属性用来对向量进行转置,请看下面的的代码:

import numpy as np

arr =np.arange(12).reshape(3,4)

# 向量 arr 为3行4列

print(arr)

# 将向量 arr 进行转置为4行3列

print(arr.T)

输出结果:

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

[[ 0 4 8]

[ 1 5 9]

[ 2 6 10]

[ 3 7 11]]

ravel() 函数

ravel() 函数用于向量展平,请看下面的代码:

import numpy as np

arr =np.arange(6).reshape(2, -1)

print(arr)

# 按照列优先, 展平

print("按照列优先, 展平")

print(arr.ravel('F'))

# 按照行优先, 展平

print("按照行优先, 展平")

print(arr.ravel())

输出结果:

[[0 1 2]

[3 4 5]]

按照列优先,展平

[0 3 1 4 2 5]

按照行优先,展平

[0 1 2 3 4 5]

flatten() 函数

flatten() 函数用来把矩阵转换为向量,这种需求经常出现在卷积网络与全连接层之间。

请看下面的代码:

import numpy as np

a =np.floor(10*np.random.random((3,4)))

print(a)

print(a.flatten())

输出结果:

[[4. 0. 8. 5.]

[1. 0. 4. 8.]

[8. 2. 3. 7.]]

[4. 0. 8. 5. 1. 0. 4. 8. 8. 2. 3. 7.]

squeeze() 函数

这是一个主要用来降维的函数,把矩阵中含1的维度去掉,请看下面的代码:

import numpy as np

arr =np.arange(3).reshape(3, 1)

print(arr.shape) #(3,1)

print(arr.squeeze().shape) #(3,)

arr1 =np.arange(6).reshape(3,1,2,1)

print(arr1.shape) #(3, 1, 2, 1)

print(arr1.squeeze().shape) #(3, 2)

transpose() 函数

对高维矩阵进行轴对换,这个在深度学习中经常使用,比如把图片中表示颜色顺序的 RGB 改为 GBR。

请看下面的代码:

import numpy as np

arr2 = np.arange(24).reshape(2,3,4)

print(arr2.shape) #(2, 3, 4)

print(arr2.transpose(1,2,0).shape) #(3, 4, 2)

python改变数组形状_NumPy数组的变形(改变数组形状)相关推荐

  1. python numpy矩阵切片_Numpy数组的索引与切片和变形拼接分裂

    1.概述 今天我们来讲一下Numpy数组的索引与切片,numpy数组的索引与切片和Python中的切片与索引的作用相同,可以快速的取出数据,进行下一步的运用或者查看,但是两种切片还有一些不同的地方.另 ...

  2. python 矩阵列拼接_numpy数组拼接简单示例

    NumPy数组是一个多维数组对象,称为ndarray.其由两部分组成: ·实际的数据 ·描述这些数据的元数据 大部分操作仅针对于元数据,而不改变底层实际的数据. 关于NumPy数组有几点必需了解的: ...

  3. python创建二维数组的方法_Python创建二维数组的正确姿势

    本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享 List (列表)是 Python 中最基本的数据结构.在用法上,它有点类似数组,因为每个列表都有一个下标,下标从 0 开始.因此 ...

  4. python中的array是什么意思_python中数组(numpy.array)的基本操作

    为什么要用numpy Python中提供了list容器,可以当作数组使用.但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表[1,2,3].就需要三个指针和三 ...

  5. 【python与数据分析】NumPy数值计算基础1——numpy数组及其运算

    目录 前言 一.创建数组 二.测试两个数组的对应元素是否足够接近 三.修改数组中的元素值 四.数组与标量的运算 五.数组与数组的运算 六.数组排序 七.数组重复 八.数组转置 九.数组所有元素累计和与 ...

  6. 《利用Python》进行数据分析:Numpy基础2 创建数组

    import numpy as np #创建数组data1=[6,7.5,8,0,1]arr1=np.array(data1)print(arr1) data2=[[1,2,3,4],[5,6,7,8 ...

  7. Python 数据分析三剑客之 NumPy(二):数组索引 / 切片 / 广播 / 拼接 / 分割

    CSDN 课程推荐:<Python 数据分析与挖掘>,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务.曾与联想.亨氏.网 ...

  8. numpy的基本使用 附python代码详细讲解(numpy函数,创建数组,常用属性,索引切片,数组的复制,修改维度,数组的分割、拼接、转置)

    目录 使用array创建数组 使用arange创建数组 Numpy中的随机数创建 ndarray对象的常用属性 其他方式创建数组 索引和切片(一位数组.二维数组) 数组的复制 修改数组的维度 数组的拼 ...

  9. python建立复数数组_深入理解NumPy简明教程---数组1

    目前我的工作是将NumPy引入到Pyston中(一款Dropbox实现的Python编译器/解释器).在工作过程中,我深入接触了NumPy源码,了解其实现并提交了PR修复NumPy的bug.在与Num ...

  10. Python多个数组合并(拼接)为一个数组

    Python中多个数组合并为一个数组的方法整理. extend方法 该方法可以扩展数组,会改变原始数组. a = [1,2,3,4,7,5,6] b = ['a','b'] c = ['h',12,' ...

最新文章

  1. IBM Thinkpad T43-44U 升级到 2G 内存后少了 66M
  2. idea中Could not autowire. No beans of 'xxxxMapper' type found.问题解决
  3. windows7下硬盘安装32位ubuntu12.04LTS
  4. 装修(十三天,面板又换错了,大理石空鼓)
  5. BugKuCTF 杂项 telnet
  6. 构造函数的执行序列(读书笔记)
  7. 5G的场景、需求、通信速率
  8. vb.net 与 c# 的switch ... case ...的一个重要区别
  9. 动态规划(五)——0/1背包
  10. php mysql_fetch_array 不要0_1_php – mysql_fetch_array不适用于1行查询结果
  11. C语言指针超全面透析(原来你一直没有搞懂C语言指针是因为没有理解其中的规律)
  12. fastReport 绑定DataBand数据源后还是打印出一条数据
  13. navicat建mysql数据库密码_Navicat修改MySQL数据库密码的多种方法
  14. 2010年10月14日糗事TOP10
  15. ​携程网全国各城市酒店数据​评论数据
  16. SpringSecurity之SecurityContext和Authentication对象
  17. 高中教师计算机面试什么时候,高中信息技术教师资格证备考经验分享(面试篇)...
  18. 传智播客推出少儿教育品牌-酷丁鱼
  19. 在Adapter里子线程更新UI线程
  20. 终于有人把云计算、大数据和 AI 讲明白了【深度好文】

热门文章

  1. vue-router 判断是否登陆,未登录跳转登陆页面
  2. 少儿Python编程6-计算机数据结构和算法
  3. Jensen–Shannon divergence
  4. 前端学习笔记一:HTML(1)预备知识及一个简单的网页
  5. docker安装ElasticSearch8.1.0错误curl: (52) Empty reply from server的处理方法
  6. 看看老牛是如何给陈彤写的信的
  7. FinClip 8月小报丨小程序转 App 支持增加第三方 SDK 配置
  8. Latex/WinEdt中文编辑
  9. PyCharm:安装/搭建/配置/插件
  10. NetXpert XG帮您解决“布线安装与维护”难题