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:真


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM