np.ascontiguousarray和np.asarray在Cython中的区别

8

关于如何正确将numpy数组传递给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声明的数组的格式存在?
2个回答

8
ascontiguousarray的文档说明它将返回一个C顺序数组,因此,如果您使用ascontiguousarray,则可以假定数据以c模式排序。
然后,为了回答两者之间的区别,我们可以查看源代码。 asarray (链接)执行以下操作:
return array(a, dtype, copy=False, order=order)

ascontiguousarray (链接) 的作用是将数组变成连续的数组:

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


2

你应该可以直接这样做:

np.ndarray[double, ndim=1, mode="c"] arr = np.array([1,2,3], dtype=np.float64, order="c")

根据np.array的文档:

order : {'C', 'F', 'A'}, optional
    Specify the order of the array.  If order is 'C' (default), then the
    array will be in C-contiguous order (last-index varies the
    fastest).  If order is 'F', then the returned array
    will be in Fortran-contiguous order (first-index varies the
    fastest).  If order is 'A', then the returned array may
    be in any order (either C-, Fortran-contiguous, or even
    discontiguous).

我的理解是,只有当您尝试传递的数组是从另一个非连续数组的某些切片生成的时,才需要使用np.ascontiguousarray。如果您正在从头开始创建数组,那么这不是必要的。

例如:

a = np.arange(10)
a.flags['C_CONTIGUOUS'] # True
b = a[::2]
b.flags['C_CONTIGUOUS'] # False

c = np.ascontiguousarray(b)
c.flags['C_CONTIGUOUS'] # True

另外,也许考虑使用typed memoryview接口。
double[::1] arr = np.array([1,2,3], dtype=np.float64)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接