2013-11-20 39 views
7

Tôi đang học Cython. Tôi có vấn đề với việc đi qua mảng numpy để Cython và không thực sự hiểu những gì đang xảy ra. Bạn có thể giúp tôi?Chuyển mảng numpy sang Cython

Tôi có hai mảng đơn giản:

a = np.array([1,2]) 
b = np.array([[1,4],[3,4]]) 

Tôi muốn tính toán một dấu chấm sản phẩm của họ. Trong python/NumPy tất cả mọi thứ hoạt động tốt:

>>> np.dot(a,b) 
array([ 7, 12]) 

tôi dịch mã để Cython (như ở đây: http://docs.cython.org/src/tutorial/numpy.html):

import numpy as np 
cimport numpy as np 

DTYPE = np.int 
ctypedef np.int_t DTYPE_t 

def dot(np.ndarray a, np.ndarray b): 
    cdef int d = np.dot(a, b) 
    return d 

Nó được biên soạn với không có vấn đề nhưng trả về một lỗi:

>>> dot(a,b) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "test.pyx", line 8, in test.dot (test.c:1262) 
    cdef int d = np.dot(a, b) 
TypeError: only length-1 arrays can be converted to Python scalars 

Bạn có thể cho tôi biết lý do và cách thực hiện chính xác không? Rất tiếc, Google không hữu ích ...

Cảm ơn!

Trả lời

7

Kết quả của bạn là np.ndarray, chứ không phải int. Nó không cố gắng để chuyển đổi đầu tiên để sau này. Thay vào đó, hãy thực hiện

def dot(np.ndarray a, np.ndarray b): 
    cdef np.ndarray d = np.dot(a, b) 
    return d 
+0

Câu hỏi liên quan đến tập lệnh của OP: là các dòng có 'DTYPE' và' ctypedef' thực sự cần thiết cho ví dụ này? Chúng có phải là cờ được sử dụng trong nội bộ một nơi nào đó không? –

Các vấn đề liên quan