Numpy 如何以最便宜的方式将一个数组转换为C连续的顺序 您所在的位置:网站首页 c语言如何把一个整数转化成数组的方法 Numpy 如何以最便宜的方式将一个数组转换为C连续的顺序

Numpy 如何以最便宜的方式将一个数组转换为C连续的顺序

2023-07-09 07:41| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有