Python 用于实现numpy.ascontiguousarray的算法是什么?

Python 用于实现numpy.ascontiguousarray的算法是什么?,python,numpy,Python,Numpy,我有一个大的2D数组F-连续,例如 >> a = np.random.random((10000000, 10)) >> b = a[:, [1,3,5,7,9]] >> b.flag() C_CONTIGUOUS : False F_CONTIGUOUS : True OWNDATA : False WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : False UPDATEIFCOPY : False 背后

我有一个大的2D数组F-连续,例如

>> a = np.random.random((10000000, 10))
>> b = a[:, [1,3,5,7,9]]
>> b.flag()
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
背后的算法是什么

>> t = time.time(); c = np.ascontiguousarray(b); print(time.time() - t)
>> 0.1587984561920166

如果我只使用简单的值复制来实现同样的事情,它将超过0.6秒。我试图在实现中查找,但找不到相关的源代码。ascontiguous的代码是:

return array(a, dtype, copy=False, order='C', ndmin=1)
复制的代码是

return array(a, order=order, copy=True)
a.copy
方法已编译,因此我们无法以相同的方式跟踪它,但它的行为可能类似于
np.copy


因此,如果源已经是
C
连续的,
ascontiguous
对其不做任何处理。如果
F
连续,结果应该(几乎)相同。

您所说的“仅使用简单值复制”是什么意思?当我将
numpy.ascontiguousarray(b)
b.copy()
进行比较时,
b.copy()
获胜(差距很小)。你永远不应该用
时间
进行严肃的基准测试。当我使用
timeit
时,我得到了
b.copy()
稍微领先。谢谢,但我真正想要的是
数组
实现背后的C代码。有太多的层,所以我不知道哪一层对应这个。通常我们认为算法是比C代码细节更抽象的描述。但是,很少有人深入研究
np.array
.copy
的细节。我猜想您想知道如何对数组中的元素重新排序,使其
C
连续(与整个
创建一个新数组
机制相反。如果是这样,那么你的问题应该集中在这一点上。我的怀疑是,经过几层决策后,
ascontiguous
最终使用相同的
c
函数将值复制到一个新数组。是的。你找到它是哪个函数了吗?基于不同的关键字参数,如
dtype
copy
order
subok
ndmin
,使用了不同的函数。我只是不知道要看的最后一个函数是什么。不,我还没有深入研究
numpy
代码。如果你解释一下为什么想知道这一点,可能会有所帮助。是吗最终结果是否重要,或者您是否试图在自己的C代码中复制该操作?