2017-09-15 1 views
2

데이터의 numpy.ndarray (M) 및 numpy.ndarray 개의 인덱스 (Ixs)를 사용하는 cython 코드가 있습니다. Ixs의 항목을 반복하며 ix의 값을 Ixs으로 사용하여 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]) 

내가이 인덱스 유형하지만 지금 나는 타입의 메모리 뷰를 사용하고 (나는 그것이 64 비트 아키텍처를 수용하는 것입니다 읽고)로 Py_ssize_t를 사용하기로하고 있음을 알고 : 아래의 코드를 참조하십시오 int ...이 경우 numpy.ndarrayPy_ssize_t으로 만드는 방법이 표시되지 않으므로 ixPy_ssize_t입니다.

이 cython 코드를 작성하는 올바른 방법은 무엇입니까? int을 사용하는 데 문제가 있습니까? 주의 할

답변

3

한 가지, 당신은 확인을 작동 작성된 ix

귀하의 코드를 입력하는 것이 좋습니다, M[c, ix]는 IX는 항상 안전한 변환해야하는 intPy_ssize_t까지 캐스팅됩니다.

즉, 인덱서 배열을 Py_ssize_t으로 설정해야합니다. 해당 NumPy와 유형 (`IXS = Ixs.atype (np.intp가)`) 그때는이 함수를 다시 작성 그래서 np.intp

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

+0

의 내가 np.intp하는 파이썬에 캐스팅이라고 할 수있다 :'데프 foo (double [:, :: 1] M, Py_ssize_t [:, :: 1] Ixs) :'맞습니까? – Gioelelm

+0

네, 이상하게도 'Ixs'는 캐스팅을 피하기 위해 intp 형식으로 작성했습니다. – chrisb

+0

물론, 내 경우에는 scikit learn 함수의 출력이 될 것입니다. – Gioelelm