2017-09-15 29 views
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_tnumpy.ndarray的方法,因此ixPy_ssize_t

写这个cython代码的正确方法是什么?使用int有什么问题吗?

回答

3

有一点要注意,你将要书面将努力确定输入ix

您的代码,M[c, ix]会投九从intPy_ssize_t,应该始终是一个安全的转换。

也就是说,你可以也可能应该让你的索引器数组为Py_ssize_t。相应numpy的类型是np.intp

https://docs.scipy.org/doc/numpy-1.13.0/user/basics.types.html

+0

所以我们可以说,我投它在Python np.intp('IXS = Ixs.atype(np.intp)'),那么我改写这个功能:'高清foo(double [:, :: 1] M,Py_ssize_t [:, 1] Ixs):'对吗? – Gioelelm

+0

是的,尽管理想的'Ixs'在创建时输入了intp来避免剧组。 – chrisb

+0

当然,但在我的情况下,它将是一个scikit学习函数的输出。 – Gioelelm

相关问题