【发布时间】:2010-12-12 06:52:23
【问题描述】:
我有一个 C 函数来规范化日志空间中数组的行(这可以防止数值下溢)。
我的C函数原型如下:
void normalize_logspace_matrix(size_t nrow, size_t ncol, double* mat);
你可以看到它需要一个指向数组的指针并修改它。 C 代码当然假定数据保存为 C 连续数组,即行连续。
我使用 Cython 将函数包装如下(省略导入和 cdef extern from):
def normalize_logspace(np.ndarray[np.double_t, ndim=2] mat):
cdef Py_ssize_t n, d
n = mat.shape[0]
d = mat.shape[1]
normalize_logspace_matrix(n, d, <double*> mat.data)
return mat
大多数时候 numpy-arrays 是行连续的,并且函数工作正常。但是,如果先前已经转置了 numpy-array,则不会复制数据,而只会返回数据的新视图。在这种情况下,我的函数失败,因为数组不再是行连续的。
我可以通过将数组定义为具有 Fortran 连续顺序来解决这个问题,这样在转置后它将是 C 连续的:
A = np.array([some_func(d) for d in range(D)], order='F').T
A = normalize_logspace(A)
显然这很容易出错,用户必须注意数组的顺序是否正确,这是用户在 Python 中不需要关心的事情。
在行连续数组和列连续数组中,如何实现这一点的最佳方法是什么?我认为 Cython 中的某种数组顺序检查是可行的方法。当然,我更喜欢不需要将数据复制到新数组中的解决方案,但我几乎认为这是必要的。
【问题讨论】: