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中,可行吗?来试一试吧。使用示例话不多说,先看看怎么用的解解馋吧…

Spring MVC –自定义RequestMappingHandlerMapping

在xml bean定义文件中使用<mvc&#xff1a;annotation-driven />配置Spring MVC时&#xff0c;在内部将一个名为RequestMappingHandlerMapping的组件注册到Spring MVC。 该组件或通常是HandlerMapping组件负责将请求URI路由到处理程序&#xff0c;这些处理程序是使用Requ…

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

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

比较容易犯的一些智障错误(不定时修改)

无论在什么学习中&#xff0c;在成长的过程中&#xff0c;注定要犯一些错误&#xff0c;有些比较高级的错误&#xff0c;有些是比较智障的错误。那么在oi的学习中&#xff0c;我们最讨厌的就是一些智障的小错误&#xff0c;因为如果是大错误的话一般情况下在测试样例的时候都是…

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

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

HTML基础入门学习准备篇

在学习前端的开始&#xff0c;让我们一起来了解什么是HTML5时代的大前端开发和全栈开发的定义传统的前端&#xff1a;切图-标签和样式-实现效果H5时代的前端&#xff1a;一、需要各端的兼容开发二、可以用于APP开发和移动站点的开发三、Ajax服务器端技术开发四、高级设计模式和…

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

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

python正则r的作用_Python正则表达式,这一篇就够了!

原标题&#xff1a;Python正则表达式&#xff0c;这一篇就够了&#xff01;大多数编程语言的正则表达式设计都师从Perl&#xff0c;所以语法基本相似&#xff0c;不同的是每种语言都有自己的函数去支持正则&#xff0c;今天我们就来学习 Python中关于 正则表达式的函数。re模块…

服务器微信了早上好,每天早上好的问候语 微信早安问候语合集66句

1、没有伞的孩子&#xff0c;必须努力奔跑&#xff01;早安&#xff01;2、你不能改变过去&#xff0c;但你可以改变未来。早安&#xff01;3、坚持了才叫梦想&#xff0c;放弃了就只是妄想。早安&#xff01;4、忘掉失败&#xff0c;不过要牢记失败中的教训。早安&#xff01;…

如何得到某个文件的旧版本

下载某个文件的旧版本 如果想要得到某个文件的旧版本&#xff0c;只需在该文件上单击右键&#xff0c;选择Updata to revision…即可。 系统会提示输入版本号。 例如要下载soc_1的第五个版本&#xff0c;只需填入5即可。如图7。 查看完版本5的文件后&#xff0c;如果想在此回到…

Google Guava EventBus和Java 7 WatchService用于事件编程

这篇文章将介绍如何使用Guava EventBus将更改发布到Java 7 WatchService检测到的目录或子目录中。 Guava EventBus是向应用程序添加发布/订阅通信的好方法。 Java 7 java.nio.file软件包中新增的WatchService用于监视目录中的更改。 由于EventBus和WatchService已在以前的文章中…

Bootstrap-table 部分浏览器显示不出来

一、问题 近日&#xff0c;写了一个ASP.Net项目&#xff0c;但是bootstrap-table在别人的电脑上显示不出来&#xff0c;在自己的电脑上能显示&#xff0c;有些浏览器也是能显示&#xff0c;但部分浏览器就是显示不出来。找了很多原因&#xff0c;最后有个老师和我说是内核版本的…

DBMS-基本概念

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

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

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

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

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

JUnit规则

第一次偶然发现JUnit Rule批注时&#xff0c;我对此概念有些恼火。 在测试用例中拥有一个公共领域似乎有些奇怪&#xff0c;因此我不愿意定期使用它。 但是一段时间后&#xff0c;我习惯了这一点&#xff0c;事实证明&#xff0c;规则可以通过多种方式简化编写测试的过程。 这篇…

微pe工具箱是微软的吗_微PE工具箱V2.0更新10内核

本帖最后由 韦小宝2 于 2017-3-22 21:26 编辑微PE工具箱V2.0发布更新了&#xff0c;链接&#xff1a;http://pan.baidu.com/s/1c9whpO 转载自无忧论坛 07年&#xff0c;第一个XP内核通用PE工具箱发布。17年&#xff0c;第一个WIN10内核的微PE工具箱就此诞生。64位纯内核&#x…

jq实现轮播图

之前设计了一个校团委网站&#xff0c;里面有一个轮播图效果&#xff0c;上网后查看了许多方法&#xff0c;觉得下面这个方法最为适用&#xff0c;记录下来 js代码&#xff1a; $(document).ready(function () {//无缝切换轮播var i 0;//索引var clone $(".banner .imgL…