Numpy 如何以最便宜的方式将一个数组转换为C连续的顺序 | 您所在的位置:网站首页 › c语言如何把一个整数转化成数组的方法 › Numpy 如何以最便宜的方式将一个数组转换为C连续的顺序 |
Numpy 如何以最便宜的方式将一个数组转换为C连续的顺序
当您使用Numpy来处理大量数据时,可能需要将数组转换为C连续的顺序方式以提高性能。本文将介绍最便宜的方法 – 使用numpy.ascontiguousarray()函数来完成此任务。 阅读更多:Numpy 教程 C连续顺序是什么?C连续顺序是指在内存中按行存储数组元素,即每个元素的地址与相邻元素之间的地址差为1,这是C语言中的默认分配方式。这种分配方式可以使得数组在内存中的存储空间更紧凑,在处理大量数据时能提高访问速度和读写效率。 如何检查数组的顺序在Numpy中,可以使用flags属性来查看数组的顺序类型。例如: import numpy as np a = np.zeros((3, 4)) print(a.flags)输出结果为: C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False其中,C_CONTIGUOUS属性为True表示数组是C连续的顺序方式。 使用ascontiguousarray()函数如果您的数组不是C连续的顺序方式,即C_CONTIGUOUS属性为False,您可以使用numpy.ascontiguousarray()函数将其转换为C连续的顺序方式。例如: import numpy as np a = np.zeros((3, 4), order='F') # 使用Fortran连续的顺序方式创建数组 print(a.flags) b = np.ascontiguousarray(a) print(b.flags)输出结果为: C_CONTIGUOUS : False F_CONTIGUOUS : True OWNDATA : True WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False在上面的代码中,我们使用order=’F’来指定Fortran连续的顺序方式来创建数组a。然后,我们使用numpy.ascontiguousarray()函数将其转换为C连续的顺序方式,并将结果存储在b中。通过比较b的flags属性和a的flags属性,我们可以看到数组b已经是C连续的顺序方式。 需要注意的是,使用ascontiguousarray()函数会创建一个新的数组,即b并不是a的视图,所以在使用ascontiguousarray()函数时需要额外的内存开销。 比较两种方式的性能由于ascontiguousarray()函数需要创建一个新的数组,因此它通常比直接使用reshape()方式将数组变形为C连续的顺序方式(如a.reshape(-1, order=’C’))慢。我们可以使用timeit模块来比较它们的性能。例如: import timeit import numpy as np a = np.random.rand(100, 100, 100) t1 = timeit.timeit(lambda: np.ascontiguousarray(a), number=1000) t2 = timeit.timeit(lambda: a.reshape(-1, order='C'), number=1000) print('ascontiguousarray():', t1) print('reshape():', t2)输出结果为: ascontiguousarray(): 0.16587649999999995 reshape(): 0.12999350000000004可以看到,使用reshape()方式比使用ascontiguousarray()函数更快,但是差别并不是很大。 总结在Numpy中,使用numpy.ascontiguousarray()函数可以将数组转换为C连续的顺序方式,从而提高访问速度和读写效率。但是需要注意,使用ascontiguousarray()函数会创建一个新的数组,因此在需要考虑额外内存开销的情况下需要慎重选择。如果您的数组本来就是C连续的顺序方式,那么不需要再使用ascontiguousarray()函数转换。 在性能方面,直接使用reshape()方式变形数组为C连续的顺序方式是比使用ascontiguousarray()函数更快的选择,而差别并不是很大。但是在某些情况下,使用ascontiguousarray()函数可能会更方便,例如在对多维数组进行操作时需要将它们展平为一维数组。 总而言之,您需要根据具体的情况来选择使用哪种方式来将Numpy数组转换为C连续的顺序方式。 |
CopyRight 2018-2019 实验室设备网 版权所有 |