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

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

修改指定数组的形状是 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. 《iOS 9应用开发入门经典(第7版)》——第1章,第1.6节小结
  2. FPGA基础之逻辑单元(LE or LC)的基本结构
  3. github操作命令
  4. php加密码访问,怎么给一个PHP密码访问页面加超链接
  5. c++ stl队列初始化_创建一个向量,并将其像C ++ STL中的数组一样初始化
  6. C语言重难点:大端小端
  7. 高可用Hadoop平台-Oozie工作流之Hadoop调度
  8. Deming质量管理14点
  9. 传奇所有客户端大合集
  10. Python工具函数
  11. 中国电信9月在京推5G新号段,资费199元至599元?
  12. Point Estimation
  13. 100天搞定机器学习|day37 无公式理解反向传播算法之精髓
  14. sws_scale()
  15. 58同城陈小华:互联网新浪潮就是O2O
  16. Codis和Redis-cluster对比
  17. Jsp+Servlet基础
  18. 2018年,请继续燃烧你的梦想
  19. iphone小小总结
  20. 电子科大计算机学院邱航教授,电子科大教计算机研室介绍

热门文章

  1. 学历的事情,你要反省,太没有效率,太托,托墨迹,太没有决断力,太TM纠结了。
  2. kali linux基本口令_kali linux 新手入坑指南(命令篇)
  3. 计算机鼠标左键不起作用,为什么电脑的左键点了不起作用
  4. 区块链学习之Web3j入门(一)
  5. 我那个工资3000的朋友,一年存了60万:聪明人从不靠死工资续命
  6. 长期一个人独自生活会怎么样?
  7. 腾讯与香港大学合作开展金融科技
  8. javascript设计模式-模块模式(module pattern)
  9. 【秋招】秋招最全指南,如何准备,如何投递,以及面试攻略大全分享!
  10. squad战术小队steam服务器搭建教程。