目录
numpy ascontiguousarra函数
转换命令:
ascontiguousarray等价效果:
ascontiguousarray学习笔记
ascontiguousarray
函数将一个内存不连续存储的数组转换为内存连续存储的数组,使得运行速度更快。
在昇腾开发版上使用时,因为内存不连续导致预测结果错误。
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.flags) # c_contiguous为True,数组a为C连续性
b = np.ascontiguousarray(a)
print(b)
print(b.flags) # c_contiguous为True,数组b为C连续性
c = np.ascontiguousarray(a, dtype=np.float32)
print(c)
print(c.flags) # c_contiguous为True,数组c为C连续性且元素类型变为np.float32
atc --model=plate.onnx --framework=5 --output=plate_rec_color_bs1 --input_format=NCHW --input_shape="images:1,3,48,168" --log=info --soc_version=Ascend310P3
img = np.ascontiguousarray(img)
img3.tofile("temp.bin")
img4 = np.fromfile("temp.bin", dtype=np.float32) # 从bin文件中读取图片
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:真