從知乎上借鑒而來,用於學習:鏈接
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:真