np.ascontiguousarray()详解
从知乎上借鉴而来,用于学习:链接
1、ascontiguousarray
函数将一个内存不连续存储的数组转换为内存连续存储的数组,使得运行速度更快。
比如我们生成一个二维数组,Numpy可以通过.flags
熟悉查看一个数组是C连续还是Fortran连续的
import numpy as np arr = np.arange(12).reshape(3,4) flags = arr.flags print("",arr) print(flags)
output:
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : False WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False
我们可以看到 C_CONTIGUOUS : True,就说明是行连续,F_CONTIGUOUS : False则代表列不连续。同理如果我们进行arr.T 或者arr.transpose(1,0)则是列连续,行不连续。
import numpy as np arr = np.arange(12).reshape(3,4) arr1 = arr.transpose(1,0) flags = arr1.flags print("",arr1) print(flags)
output:
[[ 0 4 8] [ 1 5 9] [ 2 6 10] [ 3 7 11]] C_CONTIGUOUS : False F_CONTIGUOUS : True OWNDATA : False WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False
如果进行在行上的slice即进行切割
,则会改变连续性,成为既不C连续,也不Fortran连续的:
import numpy as np arr = np.arange(12).reshape(3,4) arr1 = arr[:,0:2] flags = arr1.flags print("",arr1) print(flags)
output:
[[0 1] [4 5] [8 9]] C_CONTIGUOUS : False F_CONTIGUOUS : False OWNDATA : False WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False
此时利用ascontiguousarray
函数,可以将其变为连续的:
import numpy as np arr = np.arange(12).reshape(3,4) arr1 = arr[:,0:2] arr2 = np.ascontiguousarray(arr1) flags = arr2.flags print("",arr2) print(flags)
output:
[[0 1] [4 5] [8 9]] C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False
C_CONTIGUOUS : True
C_CONTIGUOUS:真