numpy维度交换_“lazy”的transpose()函数——从numpy 数组的内存布局讲起

aa98806f3595639fdf647aeb8d3fc0e0.png

1 数组的两种内存布局方式

行优先与列优先

首先我们回顾一下,矩阵数据在内存中的两种布局方式:

  • 行优先(row-major):以行为优先单位,在内存中逐存储/读取;对于多维,意味着当线性扫描内存时,第一个维度的变化最慢。
  • 列优先(column-major):以列为优先单位,在内存中逐存储/读取;对于多维,意味着当线性扫描内存时,最后一个维度的变化最慢。

以下面的[2, 2, 2]张量为例:

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

在内存中的数据排布:

行优先:1, 2 | 3, 4 || 5, 6 | 7, 8a[0,0] a[0,1] a[1,0] a[1,1]
列优先:1, 5 | 3, 7 || 2, 6 | 4, 8a[0,0] a[1,0] a[0,1] a[1,1]

谁更好?

选择行优先还是列优先,主要取决于我们访问数组的模式。由于每次从内存中获取数据时,CPU都会自动将该数据及其相邻的内存加载到缓存中,希望利用引用的局部性。因此,如果访问数组时是逐列访问的,我们就希望同一列的数据在内存中靠得更近,便于一次性加载到CPU缓存中从而避免反复加载,亦即更加的“Cache-friendly”,此时列优先显然是最好的选择。而对于逐行访问的情况,则应该选择行优先。

C和大多数DeepLearning库用的都是行优先,而Fortran和matlab等一些用于科学计算的语言,使用的是列优先。不要问为什么,这是历史的偶然选择而已。如果要强行解释,可以说Fortran是考虑到线性代数中的向量默认为列向量,所以用列优先与数学符号更匹配,虽然用列优先并不会加速矩阵运算(比如矩阵乘法中第一个矩阵是逐行访问,第二个是逐列访问,不可兼得),但是更能显现出科学家与众不同的装逼特性 :-) 。

2 numpy 中的行优先和列优先

numpy支持这两种内存布局方式,默认采用行优先。可以在新建array,或者进行reshape等操作时,通过指定order参数来决定数据的内存布局方式。

array() 新建

函数原型:

array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)

参数:

  • dtype: 存储单元格式,有np.float32、np.bool、np.int32等。
  • copy: 是否在内存中新建array。
  • subok: (不用管)If True, then sub-classes will be passed-through, otherwise the returned array will be forced to be a base-class array (default).
  • ndmin: 返回的数组应该具有至少ndmin个维数,不足时补充若干个大小为1的维度。
np.array([[1,2,3],[4,5,6]]).shape
Out[52]: (2, 3)
np.array([[1,2,3],[4,5,6]], ndmin=4).shape
Out[53]: (1, 1, 2, 3)
  • order: 新建的array在内存中的布局方式(该参数在copy==True时才有意义),从 {‘K’, ‘A’, ‘C’, ‘F’} 中选择;

dedfafcf1400adf0c11bcaf18f55cf0c.png

举个例子:

s = [[1,2,3], ['a','b','c']]  # python序列采用行优先布局
# 内存中 s :1, 2, 3, 'a', 'b', 'c'a = np.array(s, order='C')
# a.reshape(-1) :'1', '2', '3', 'a', 'b', 'c'b = np.array(s, order='F')
# b.reshape(-1) :'1', 'a', '2', 'b', '3', 'c'

reshape() 重整维度

函数原型:

reshape(array, newshape, order='C')
array.reshape(newshape, order='C')

参数:

  • newshape: 一个描述各维度大小的序列,也可以是单个int。
  • order: 从 {‘A’, ‘C’, ‘F’} 中选择。

b = reshape(a, newshape, order)相当于:

b = np.array(a, order)  # 在内存中新建一个 b ,以 order 布局方式存储从 a 中读取的数据
b.shape = newshape  # 设定index指针的计算方式

3 “lazy”的 transpose() 转置

注意,numpy中的转置transpose()是非常“lazy”的,亦即不对内存中的数据进行重排,仅仅改变读取方式

举个例子:

''' a.shape = [1,2,3] '''
transpose_scheme = [2,1,0]  # 维度0与2交换位置
b = np.transpose(a, axes=transpose_scheme)
'''
此时 b.shape 虽然变成了 [3,2,1]
但是 b 与 a 在内存的排布是一样的
'''

transpose()等效于:在读取/写入函数函数外,包了一个能改变维度顺序的函数装饰器。

def change_axis_order(transpose_scheme):def get_func(func):@wraps(func)def wrapper(self, axes):transposed_axes = [axes[i] for i in transpose_scheme]return func(self, transposed_axes)return wrapperreturn get_func'''
b = np.transpose(a, axes=transpose_scheme)
相当于:
'''
b = a.copy()
b.__getitem__ = change_axis_order(transpose_scheme)(b.__getitem__)
b.__setitem__ = change_axis_order(transpose_scheme)(b.__setitem__)

之所以采用这种“lazy”的方式,是因为重新在内存中排列数据的非常耗时的。

如果一定要在内存中重新排列数据,可以采用以下方法:

b = np.zeros_like(a)
b[:] = np.array(a, axes=transpose_scheme)

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

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

相关文章

云耀服务器切换系统,【计算】云耀服务器-常见操作汇总指南

通过上期的介绍,相信大家对于云耀云服务器的基本知识有了一个了解。云耀云服务器是一个具备独立、完整的操作系统和网络功能,可快速搭建简单应用的新一代云服务器。接下来,本期为大家带来关于云耀云服务器使用中的一些简单方法和小技巧。1.云…

机器学习应该准备哪些数学预备知识?

转 https://www.zhihu.com/question/36324957 https://www.zhihu.com/question/36324957/answer/139408269 机器学习应该准备哪些数学预备知识? 数据分析师,工作中经常使用机器学习模型,但是以调库为主。 自己一直也在研究算法,也…

react usecontext_Vue3原理实战运用,我用40行代码把他装进了React做状态管理

前言vue-next是Vue3的源码仓库,Vue3采用lerna做package的划分,而响应式能力vue/reactivity被划分到了单独的一个package中。如果我们想把它集成到React中,可行吗?来试一试吧。使用示例话不多说,先看看怎么用的解解馋吧…

css的三个特性 背景透明设置

关于行内元素(补充一点) 行内元素只能容纳文本或其他行内元素。(a特殊a里面可以放块级元素) 例子: 关于行高tip: 选择器的嵌套层级不应大于3级,位置靠后的限定条件应尽可能的精确。 属性定义必须另起一行…

ccs安装多版本编译器离线_大数据分析:学习工具JDK,在线安装指南

hadoop是使用Java语言开发的并且Hadoop运行需要有Java环境的支持,因此在安装hadoop之前需要安装Java开发环境即JDK(Java Development Kit)。安装前首先向大家介绍以一下本文会用到的几个词:JAVA_HOME:一是为了方便引用,比如,JDK安…

asp.net尚未在web服务器上注册_最新版Web服务器项目详解 00 项目概述

点 击 关 注 上 方"两猿社"设 为"置 顶 或 星 标",干 货 第 一 时 间 送 达。互 联 网 猿 | 两 猿 社TineyWebServerLinux下C轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器…

DBMS-基本概念

文件处理系统(file-processing system)的主要弊端: 数据冗余和不一致(data redundancy and inconsistency)、数据访问困难(difficulty in accessing data)、数据孤立(data isolation…

python多大孩子可以学_孩子学编程最佳年龄是多大

儿童编程教育已经悄悄地掀起了编程低龄化的热浪。但是很多人会疑惑,到底孩子学编程最佳年龄是多少呢?下面小编就为大家解答一下。孩子学编程最佳年龄 首先,孩子的学习黄金时期是非常重要的。从6岁开始,大多数孩子都可以掌握对基本…

上传文件到华为云云服务器,上传文件到云服务器

上传文件到云服务器 内容精选换一换登录Windows操作系统的弹性云服务器时,需使用密码方式登录。因此,用户需先根据创建弹性云服务器时使用的密钥文件,获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设…

关于图片预加载的思考

引子&#xff1a; 很多时候&#xff0c;我们在写html页面的时候&#xff0c;当需要在页面中加入图片时&#xff0c;我们很自然地把图片直接用<img>标签放在了<body>里面&#xff0c;这本来是没有多大问题的。 但是当图片数量很多的时候&#xff0c;问题就来了。H…

SpringBoot03 项目热部署

1 问题 在编写springBoot项目时&#xff0c;经常需要修改代码&#xff1b;但是每次修改代码后都需重新启动&#xff0c;修改的代码才会生效 2 这么实现IDEA能够像Eclipse那样保存过后就可以自动进行刷新呢 将springBoot项目进行热部署即可 3 如何实现SpringBoot项目的热部署01 …

STM32实现流水灯

led.c #include"led.h"void Led_Init(void) {GPIO_InitTypeDef GPIO_VALUE; //???RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//???GPIO_VALUE.GPIO_ModeGPIO_Mode_Out_PP;//???? ????GPIO_VALUE.GPIO_PinGPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_…

jacob 报错 Can't co-create object

问题&#xff1a;开始时一切正常&#xff0c;后来什么都没该&#xff0c;出现Cant co-create object报错&#xff0c;即是创建不了ActiveXComponent wdnew ActiveXComponent("Word.Application"); 偶尔发现任务管理器中word进程居然达到10个&#xff0c;而我没有打开…

wxpython可视化_使用wxPython的绘图模块wxPyPlot进行数据可视化

[Python进阶(四十)-数据可视化の使用matplotlib进行绘图前言  matplotlib是基于Python语言的开源项目&#xff0c;旨在为Python提供一个数据绘图包。我将在这篇文章中介绍matplotlib A #-*- coding: utf-8 -*- ############################################################…

如何让浮动的元素换行??css

当你想要做成这种布局效果的时候 紫色框里面的内容那样 它是一个列表 li元素是块级元素 默认大小是父元素ul的宽 并且换行 如果li没有背景的话那就不用管了 可是问题来了它不但有背景 而且是根据文字自适应的宽高 这就是inline-block类型的功能了 那么想让li是inline-bl…

设置博客园标题样式

1.向博客园申请js权限 我们需要进入博客园自定义博客模板的页面&#xff0c;向博客园管理团队申请页面运行js的权限。【博客园】->【设置】->【博客设置】&#xff0c;点击页面上的js权限申请&#xff0c;然后填写申请的理由&#xff0c;耐心等几分钟&#xff0c;再刷新一…

关联查询mysql_《MySQL数据库》关联查询

原标题&#xff1a;《MySQL数据库》关联查询一、关联查询1、概念在查询数据时&#xff0c;所需要的数据不只在一张表中&#xff0c;可能在两张或多张表中。这个时候&#xff0c;需要同时操作这些表来查询数据&#xff0c;即关联查询。关联查询所涉及到的表与表之间都会存在有关…

NOIP2017年11月9日赛前模拟

最后一次NOIP模拟了 题目1&#xff1a;回文数字 Tom 最近在研究回文数字。  假设 s[i] 是长度为 i 的回文数个数&#xff08;不含前导0&#xff09;&#xff0c;则对于给定的正整数 n 有&#xff1a; 以上等式中最后面的括号是布尔表达式&#xff0c;Tom 想知道S[n] mod 2333…

mysql视图表怎么设置约束_MySQL一一sql的视图、索引、约束

一、视图本质上相当于一张**“虚拟表”**&#xff0c;可当作独立的一张表进行操作(增、删、改、查)** 作用&#xff1a;**** a)**可通过权限控制&#xff0c;只将“表中的少数列”暴露给数据库用户&#xff0c;而不让该用户直接操纵数据库中“实际表”** b)**…

Software Development Life Cycle

转载于:https://www.cnblogs.com/genezhao/p/6879848.html