Python 索引的Cython内存视图应该是Py_ssize_t类型还是int类型?

Python 索引的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

我有一个cython代码,它接受2d
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学习函数的输出。