Python 索引的Cython内存视图应该是Py_ssize_t类型还是int类型?
我有一个cython代码,它接受2dPython 索引的Cython内存视图应该是Py_ssize_t类型还是int类型?,python,arrays,numpy,cython,cpython,Python,Arrays,Numpy,Cython,Cpython,我有一个cython代码,它接受2dnumpy.ndarray数据(M)和numpy.ndarray索引(Ixs)。它循环遍历Ixs的条目,并使用Ixs的ix值索引M的列。请参阅下面的代码: def foo(double[:, ::1] M, int[:, ::1] Ixs): cdef int rows = M.shape[0] cdef int cols = M.shape[1] cdef Py_ssize_t c, r for c in range(rows
numpy.ndarray
数据(M
)和numpy.ndarray
索引(Ixs
)。它循环遍历Ixs
的条目,并使用Ixs
的ix
值索引M
的列。请参阅下面的代码:
def foo(double[:, ::1] M, int[:, ::1] Ixs):
cdef int rows = M.shape[0]
cdef int cols = M.shape[1]
cdef Py_ssize_t c, r
for c in range(rows):
for r in range(cols):
ix = Ixs[c, r]
dosomething(M[c, ix])
我知道我应该使用Py\u ssize\u t
作为索引类型(我读过它是为了适应64位体系结构),但现在我使用的是int
类型的内存视图。。。在这种情况下,我看不到创建Py_-ssize\u t
的numpy.ndarray
的方法,因此ix
是Py_-ssize\t
写这个cython代码的正确方法是什么?使用
int
有什么问题吗?需要注意的是,您需要键入ix
您编写的代码将正常工作,M[c,ix]
将ix从int
转换为Py\u ssize\t
,这应该是一种安全的转换
也就是说,您可以而且可能应该让索引器数组为Py\u ssize\t
。相应的numpy类型是np.intp
假设我用python将其转换为np.intp(
Ixs=Ixs.atype(np.intp)
),然后我将此函数重写为:def foo(double[:,::1]M,Py_ssize\u t[:,::1]Ixs):
对吗?是的,尽管理想情况下,Ixs
在创建时键入intp以避免转换。当然,但在我的例子中,它将是一个scikit学习函数的输出。