데이터의 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.ndarray
을 Py_ssize_t
으로 만드는 방법이 표시되지 않으므로 ix
은 Py_ssize_t
입니다.
이 cython 코드를 작성하는 올바른 방법은 무엇입니까? int
을 사용하는 데 문제가 있습니까? 주의 할
의 내가 np.intp하는 파이썬에 캐스팅이라고 할 수있다 :'데프 foo (double [:, :: 1] M, Py_ssize_t [:, :: 1] Ixs) :'맞습니까? – Gioelelm
네, 이상하게도 'Ixs'는 캐스팅을 피하기 위해 intp 형식으로 작성했습니다. – chrisb
물론, 내 경우에는 scikit learn 함수의 출력이 될 것입니다. – Gioelelm