跟进问题how to pass numpy array to Cython function correctly? :
当将 Cython 中的 numpy.ndarrays 传递给只处理连续数组的 C 函数时,做之间有区别吗:
np.ndarray[double, ndim=1, mode="c"] arr = np.ascontiguousarray(np.array([1,2,3],dtype=float))
和
np.ndarray[double, ndim=1, mode="c"] arr = np.asarray(np.array([1,2,3],dtype=float), order="c")
两者都需要吗? np.ascontiguous
是否已经暗示数组的格式可以分配给带有 mode=c
声明的数组?
最佳答案
docs for ascontiguousarray
声明它将返回一个 C 有序数组,所以是的,如果您使用 ascontiguousarray
然后您可以假设数据在 c
中排序模式。
然后要回答两者之间有什么区别,我们可以阅读源代码。
asarray
( link) 这样做:
return array(a, dtype, copy=False, order=order)
ascontiguousarray
( link ) 这样做:
return array(a, dtype, copy=False, order='C', ndmin=1)
因此,当您使用 order='C'
调用 asarray 时,与 ascontiguousarray
的唯一区别是您选择了 ndmin 的默认值,即 0
。这归结为这种差异,当您在单个数字而不是列表上使用这两种方法时:
print asarray(4,dtype='float',order='c').shape
()
print ascontiguousarray(4,dtype='float').shape
(1,)
这取决于你,但我更喜欢 ascontiguousarray
,因为我经常依赖于处理数组的形状属性的可能性,并期望它是非空的。从某种意义上说,这就像同时调用 atleast1d
。
关于python - np.ascontiguousarray 与 np.asarray 与 Cython,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22105529/