2
我有一个cython代码,其数据(M
)和numpy.ndarray
的索引(Ixs
)需要2d numpy.ndarray
。它遍历Ixs
的条目并使用Ixs
的值ix
来索引M
的列。请参见下面的代码:应该将索引的Cython内存视图的类型为Py_ssize_t或int?
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_ssize_t
作为一个类型的索引(我读它是为了配合64位体系结构),但现在我使用类型的内存视图int
...在这种情况下,我看不到创建Py_ssize_t
的numpy.ndarray
的方法,因此ix
是Py_ssize_t
。
写这个cython代码的正确方法是什么?使用int
有什么问题吗?
所以我们可以说,我投它在Python np.intp('IXS = Ixs.atype(np.intp)'),那么我改写这个功能:'高清foo(double [:, :: 1] M,Py_ssize_t [:, 1] Ixs):'对吗? – Gioelelm
是的,尽管理想的'Ixs'在创建时输入了intp来避免剧组。 – chrisb
当然,但在我的情况下,它将是一个scikit学习函数的输出。 – Gioelelm