深圳网站建设制作报价,沈阳小程序开发报价,做电影网站详细教程,网站建设多少钱裙Return a contiguous array (ndim 1) in memory (C order).用途ascontiguousarray函数将一个内存不连续存储的数组转换为内存连续存储的数组#xff0c;使得运行速度更快。C order vs Fortran orderC order 指的是行优先的顺序(Row-major Order)#xff0c;…Return a contiguous array (ndim 1) in memory (C order).用途ascontiguousarray函数将一个内存不连续存储的数组转换为内存连续存储的数组使得运行速度更快。C order vs Fortran orderC order 指的是行优先的顺序(Row-major Order)即内存中同行的元素存在一起Fortran Order则指的是列优先的顺序(Column-major Order)即内存中同列的元素存在一起。Pascal, CCPython都是行优先存储的而FortranMatLab是列优先存储的。Contiguous arraycontiguous array指的是数组在内存中存放的地址也是连续的(注意内存地址实际是一维的)。2维数组arr np.arange(12).reshape(3,4)。数组结构如下在内存里中实际存储如下arr是 C order 的在内存是行优先的。如果想要向下移动一列则需要跳过3个块(例如从0到4只需要跳过1,2和3)。如果经过转置arr.T没有了C连续特性因为内存中元素的地址不变同一行中的相邻元素在内存中不是连续的:这时arr.T变成了Fortran order因为相邻列中的元素在内存中是相邻存储的。从性能上来说获取内存中相邻的地址比不相邻的地址速度要快很多(从RAM读取一个数值的时候可以连着一起读一块地址中的数值并且可以保存在Cache中)这意味着对连续数组的操作会快很多。由于arr是C连续的因此对其进行行操作比进行列操作速度要快。通常来说np.sum(arr, axis1) # 按行求和会比np.sum(arr, axis0) # 按列求和稍微快些。 同理在arr.T上列操作比行操作会快些。使用 np.ascontiguousarray()Numpy中随机初始化的数组默认都是C连续的。经过不规则的slice操作则会改变连续性可能会变成既不是C连续也不是Fortran连续的。可以通过数组的.flags属性查看一个数组是C连续还是Fortran连续的 import numpy as np arr np.arange(12).reshape(3, 4) arr.flagsC_CONTIGUOUS : TrueF_CONTIGUOUS : FalseOWNDATA : FalseWRITEABLE : TrueALIGNED : TrueWRITEBACKIFCOPY : FalseUPDATEIFCOPY : False从输出可以看到数组arr是C连续的。 对arr进行按列的slice操作不改变每行的值则还是C连续的 arrarray([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]]) arr1 arr[:2, :] arr1array([[ 0, 1, 2, 3],[ 4, 5, 6, 7]]) arr1.flagsC_CONTIGUOUS : TrueF_CONTIGUOUS : FalseOWNDATA : FalseWRITEABLE : TrueALIGNED : TrueWRITEBACKIFCOPY : FalseUPDATEIFCOPY : False如果进行在行上的slice则会改变连续性成为既不C连续也不Fortran连续的 arr1 arr[:, 1:3] arr1.flagsC_CONTIGUOUS : FalseF_CONTIGUOUS : FalseOWNDATA : FalseWRITEABLE : TrueALIGNED : TrueWRITEBACKIFCOPY : FalseUPDATEIFCOPY : False此时利用ascontiguousarray函数可以将其变为连续的 arr2 np.ascontiguousarray(arr1) arr2.flagsC_CONTIGUOUS : TrueF_CONTIGUOUS : FalseOWNDATA : TrueWRITEABLE : TrueALIGNED : TrueWRITEBACKIFCOPY : FalseUPDATEIFCOPY : False参考本篇文章由一文多发平台ArtiPub自动发布