Numpy从入门到精通——数组变形|合并数组

news2024/9/22 5:28:10

这个专栏名为《Numpy从入门到精通》,顾名思义,是记录自己学习numpy的学习过程,也方便自己之后复盘!为深度学习的进一步学习奠定基础!希望能给大家带来帮助,爱睡觉的咋祝您生活愉快! 这一篇介绍《Numpy从入门到精通——数组变形|合并数组

在这里插入图片描述

文章目录

  • 一、修改数组的形状
    • 1.1 reshape函数
    • 1.2 resize函数
    • 1.3 T函数
    • 1.4 ravel函数
    • 1.5 flatten(order="C")函数
    • 1.6 squeeze函数
    • 1.7 transpose函数
  • 二、合并数组
    • 2.1 append函数
    • 2.2 concatenate函数
    • 2.3 stack函数
    • 2.4 zip函数

在深度学习中,常常会涉及到矩阵的变形。在实际任务中,我们常常需要将处理好的数据以模型能接收的形式发送,然后通过模型计算出一个结果返回。不同模型所要接受的数据的格式是不一样的,这就要求我们将数据处理成符合模型要求的格式。最常见的就是矩阵或者是数组的运算,所以这次我们分享numpy怎么样进行数组变形和合并数组。

一、修改数组的形状

首先我们给出numpy中修改向量的一些常用函数:

函数描述
arr.reshape重新对向量arr维度进行改变,不修改向量本身
arr.resize重新对向量arr维度进行改变,修改向量本身
arr.T对向量arr进行转置
arr.ravel对向量arr进行展平,即将多维数组变成1维数组,不会产生原数组的副本
arr.flatten对向量arr进行展平,即将多维数组变成1维数组,返回原数组的副本
arr.squeeze只能对维数为1的数组降维。对多维数组使用时虽然不会报错,但是不会产生任何影响
arr.transpose对高维矩阵进行轴对换

下面我们通过具体的代码看每一个函数的效果:

1.1 reshape函数

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_19.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/22 10:48 
"""
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]]

值得注意的是,说设置的行数和列数一定要能够被整除,否则会报错!

1.2 resize函数

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_20.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/22 10:52 
"""
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]]

resize是没有返回值的,直接在原数组上进行操作。

1.3 T函数

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_21.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/22 10:58 
"""
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]]

转置是有返回值的,所有可以用print直接输出出来。

1.4 ravel函数

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_22.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/22 11:00 
"""
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]

默认情况是按照行优先进行排序,设置“F”可以安装列优先进行展开。

1.5 flatten(order=“C”)函数

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_23.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/22 11:08 
"""
import numpy as np
a =np.floor(10*np.random.random((3,4)))
print(a)
print(a.flatten(order='C'))
print(a)

输出为:

[[4. 5. 5. 7.]
 [3. 7. 3. 0.]
 [0. 4. 6. 0.]]
[4. 5. 5. 7. 3. 7. 3. 0. 0. 4. 6. 0.]
[[4. 5. 5. 7.]
 [3. 7. 3. 0.]
 [0. 4. 6. 0.]]

flatten经常在卷积网络与全连接层之间,一般在网络需要把2维,3维的多维数组转化为一维数组时使用:
在这里插入图片描述

1.6 squeeze函数

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)

输出为:

(3, 1)
(3,)
(3, 1, 2, 1)
(3, 2)

squeeze函数主要用于降维,可以把数组中含1的维度去掉。

1.7 transpose函数

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)

输出:

(2, 3, 4)
(3, 4, 2)

还记得我们之前说opencv读取图片是BGR格式的吗?我们可以通过numpy.transpose函数进行轴对换,变成RGB格式,再用plt就能正常显示了!

二、合并数组

合并数组也是比较常见的操作之一,同样的,我们先看有哪些函数然后对这些函数进行说明:

函数描述
np.append内存占用大
np.concatenate没有内存问题
np.stack沿着新的轴加入一系列数组
np.hstack栈数组垂直顺序(行)
np.vstack栈数组垂直顺序(列)
np.dstack栈数组按顺序深入(沿第3维)
np.vsplit将数组分解成垂直的多个子数组的列表
zip[iterable,…]将对象中对应的元素打包成一个个元组构成的zip对象

说明

  • append、concatnate以及stack函数都有一个 axis 参数,用于控制数组合并是按行还是按列排序。
  • append和concatnate函数中待合并的数组必须有相同的行数或列数(满足一个即可)。
  • stack、hstack、dstack函数中待合并的数组必须具有相同的形状( shape)。

2.1 append函数

合并一维数组

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_26.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/22 11:40 
"""
import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.append(a, b)
print(c)
# [1 2 3 4 5 6]

输出:

[1 2 3 4 5 6]

合并多维数组

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_27.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/22 11:41 
"""
import numpy as np

a = np.arange(4).reshape(2, 2)
b = np.arange(4).reshape(2, 2)
# 按行合并
c = np.append(a, b, axis=0)
print('按行合并后的结果')
print(c)
print('合并后数据维度', c.shape)
# 按列合并
d = np.append(a, b, axis=1)
print('按列合并后的结果')
print(d)
print('合并后数据维度', d.shape)

输出为:

按行合并后的结果
[[0 1]
 [2 3]
 [0 1]
 [2 3]]
合并后数据维度 (4, 2)
按列合并后的结果
[[0 1 0 1]
 [2 3 2 3]]
合并后数据维度 (2, 4)

2.2 concatenate函数

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_28.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/22 11:43 
"""
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])

c = np.concatenate((a, b), axis=0)
print(c)
d = np.concatenate((a, b.T), axis=1)
print(d)

输出为:

[[1 2]
 [3 4]
 [5 6]]
[[1 2 5]
 [3 4 6]]

2.3 stack函数

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_29.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/22 11:43 
"""
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(np.stack((a, b), axis=0))

输出为:

[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]

2.4 zip函数

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_30.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/22 11:45 
"""
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
c = c = zip(a, b)
for i, j in c:
    print(i, end=",")
	print(j)

输出为:

[1 2],[5 6]
[3 4],[7 8]

zip函数组合两个向量

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_31.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/22 11:49 
"""
import numpy as np

a1 = [1, 2, 3]
b1 = [4, 5, 6]
c1 = zip(a1, b1)
for i, j in c1:
    print(i, end=",")
    print(j)

输出为:

1,4
2,5
3,6

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SLAM论文速递:SLAM—— 流融合:基于光流的动态稠密RGB-D SLAM—4.25(2)

论文信息 题目: FlowFusion:Dynamic Dense RGB-D SLAM Based on Optical Flow 流融合:基于光流的动态稠密RGB-D SLAM论文地址: https://arxiv.org/pdf/2003.05102.pdf发表期刊: 2020 IEEE International Conference on Robotics and Automa…

【Spring Cloud】Spring Cloud 是什么?

文章目录 前言一、子项目二、常用组件三、把 Spring Cloud 官方、Netflix、Alibaba 三者整理成如下表格: 前言 Spring 以 Bean(对象) 为中心,提供 IOC、AOP 等功能。Spring Boot 以 Application(应用) 为中…

Python小姿势 - Python操作Excel表格数据

Python操作Excel表格数据 在日常工作中,我们经常会遇到一些需要对表格数据进行处理的情况,比如:数据清洗、数据分析、数据可视化等。对于这些任务,我们可以使用Python来进行操作。 在Python中操作Excel表格数据,我们可…

electron+vue3全家桶+vite项目搭建【13】封装加载进度显示,新建窗口 演示主进程与渲染进程通信

文章目录 引入实现效果演示:1.封装新建窗口工具2.测试新建窗口3.封装进度条加载4.测试进度条加载 引入 这里我们通过封装electron的工具类来演示electron中的主进程和渲染进程利用ipc进行通信 demo项目地址 electron官方文档ipc通信 实现效果演示: …

通过注册表设置远程桌面的配置

***************************修改远程终端端口号*************************** [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\Wds\rdpwd\Tds\tcp] "PortNumber"dword:00000d3d [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Ser…

代码优雅之道——如何干掉过多的if else

1、前言 注意标题是过多的,所以三四个就没必要干掉了。实际开发中我们经常遇到判断条件很多的情况,比如下图有20多种情况,不用想肯定是要优化代码的,需要思考的是如何去优化? 网上很多说用switch case啊,首…

算法刷题|198.打家劫舍、213.打家劫舍Ⅱ、337.打家劫舍Ⅲ

打家劫舍 题目:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定…

【社区图书馆】Fundamentals Of Computer Graphics——The beginning of computer graphics

目录 English 中文 English "Fundamentals Of Computer Graphics" is a classic textbook on computer graphics, also known as the "Tiger Book". It is considered one of the best introductory texts in the field of computer graphics. The book …

1分钟搭建自己的GPT网站

如果觉得官方免费的gpt(3.5)体验比较差,总是断开,或者不会fanqiang,那你可以自己搭建一个。但前提是你得有gpt apikey。年初注册的还有18美金的额度,4.1号后注册的就没有额度了。不过也可以自己充值。 有了…

【Redis】Redis事务

介绍 可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化, 按顺序地串行化执行而不会被其他命令插入一个队列中,一次性、顺序性、排他性的执行一系列命令没有隔离级别的概念,没有脏读、不可重复读等。 …

思维导图从入门到大神

思维导图怎么做?思维导图是一种发散性思维的图。在我们生活的方方面面都有运用。无论是工作、学习、还是生活,我们都可以用到它。那思维导图是怎么绘制的呢?其实非常简单,只要这简单的几步 1、首先在绘制思维导图前,我…

veImageX 演进之路:iOS 高性能图片加载 SDK

动手点关注 干货不迷路 1. SDK简介 图片在业务应用场景是一个常见的元素,veImageX(简称ImageX)为业务提供了灵活、高效的一站式图片处理解决方案,包括了服务端 SDK、上传 SDK 和客户端图片加载 SDK。本文就来介绍下 iOS 客户端图…

力扣 1493(删掉一个元素以后全为 1 的最长子数组)Java

目录 题目 约束 用例 解题思路 各位看官先看执行结果 这道题呢,采用的滑动窗口思想。 题目 给你一个二进制数组 nums ,你需要从中删掉一个元素。 请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。 如果不存在…

15天学习MySQL计划-索引(进阶篇)第七天

索引 1.索引概述 1.介绍 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数…

HTTP1.1(十二)Cookie的格式与约束

一 Cookie的格式与约束 ① Cookies是什么 1) cookie是我们在前端编程中经常使用的概念2) 使用cookie利用浏览器帮助我们保存客户的相关状态信息,保存用户已经做了什么事情3) 重点和难点[1]、cookie的工作原理[2]、cookie的限制是什么[3]、session又是怎样与cookie关联起来 …

【Android Framework (七) 】- ActivityManagerService(AMS)

文章目录 知识回顾启动第一个流程initZygote的流程system_serverServiceManagerBinderLauncher的启动 前言源码分析1.AMS的启动. ActivityManagerService.java2.setSystemProcess3.应用进程的初始化4.Activity的启动流程 拓展知识1.介绍一下Activity的启动流程。2.ActivityMana…

Handbook of MusicPsychology 音乐心理学手册 ( 多纳德·霍杰斯 Donald.A.Hodges) 笔记

由两个以上的音组成的结合音,除了该声波的波形,人耳会另外脑补出不存在的波形 频率相距较远的一些音与频率相距较近的一些音,前者累加的响度比后者要大 除了泛音部分,音的起声部分也是音色辨别的关键 音高、响度、音色、时值&a…

托福高频真词List07 // 附托福TPO阅读真题

目录 ​ 4月24日单词 生词 熟词 4月25日真题 4月24日单词 生词 🍡live in strictly aquatic habitat / əˈkwɑːtɪk / 🍡only live in aquatic environment 只生活在水生环境中 readilyquickly readilyeasily adv 迅速地 adv 轻易地 wide…

聚观早报|中国将是ChatGPT主要对手;​iPhone 15将使用USB-C接口

今日要闻:中国将是ChatGPT主要对手;iPhone 15将使用USB-C接口;31名ChatGPT训练派遣工遭解雇;大疆Mavic 3 Pro无人机高清图曝光;中国红牛回应被禁止生产销售 中国将是ChatGPT主要对手 微软总裁布拉德史密斯接受采访时表…

前端开发之vue动态路由实现方案

前端开发之vue动态路由实现方案 前言2. 实现1、登录页面创建登录函数和watch监听路由2、调用的login方法(1)登录方法(2)存储token 3、router.push的时候调用路由守卫(1)创建路由守卫,建议路由守…