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:真
posted @ 2020-08-07 21:32  九叶草  阅读(9519)  评论(0编辑  收藏  举报