2013-11-20 6 views
7

पर numpy सरणी पास करना मैं साइथन सीख रहा हूँ। मुझे साइथन के लिए numpy arrays गुजरने में समस्या है और वास्तव में समझ में नहीं आता कि क्या हो रहा है। क्या तुम मेरी मदद कर सकते हो?साइथन

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

मैं उनमें से एक डॉट उत्पाद की गणना करना चाहते हैं:

मैं दो सरल सरणियों की है। (यहाँ के रूप में: http://docs.cython.org/src/tutorial/numpy.html):

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

मैं Cython करने के लिए कोड अनुवाद: अजगर में/numpy सब कुछ ठीक काम करता है

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 

यह कोई समस्या नहीं के साथ संकलित लेकिन एक त्रुटि देता है:

>>> 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 

क्या आप मुझे बता सकते हैं कि यह सही तरीके से क्यों और कैसे करें? दुर्भाग्य से Google सहायक नहीं था ...

धन्यवाद!

उत्तर

7

आपका परिणाम np.ndarray है, int नहीं। यह पहले एक को बाद में बदलने की कोशिश में विफल रहता है। इसके बजाय

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

ओपी की लिपि से संबंधित एक प्रश्न: क्या इस उदाहरण के लिए वास्तव में आवश्यक 'डीटीईपीई' और 'ctypedef' वाली रेखाएं हैं? क्या वे आंतरिक रूप से कहीं भी इस्तेमाल किए गए झंडे हैं? –