मैंने कुछ प्रकार जोड़कर और इसे संकलित करके साइथन को एक पायथन फ़ंक्शन में परिवर्तित कर दिया। मुझे अजगर और साइथन कार्यों के परिणामों के बीच छोटे संख्यात्मक मतभेद मिल रहे थे। कुछ काम करने के बाद मैंने पाया कि अंतर int के बजाय हस्ताक्षरित int का उपयोग करके एक numpy सरणी तक पहुंचने से आया था।साइथन: numpy arrays के लिए हस्ताक्षरित int इंडेक्स अलग-अलग परिणाम देता है
मैं अहस्ताक्षरित पूर्णांक सूचकांक उपयोग कर रहा था के अनुसार पहुँच तेजी लाने के लिए: http://docs.cython.org/src/userguide/numpy_tutorial.html#tuning-indexing-further
वैसे भी मैंने सोचा कि यह अहस्ताक्षरित ints उपयोग करने के लिए हानिरहित था।
cpdef function(np.ndarray[np.float32_t, ndim=2] response, max_loc):
cdef unsigned int x, y
x, y = int(max_loc[0]), int(max_loc[1])
x2, y2 = int(max_loc[0]), int(max_loc[1])
print response[y,x], type(response[y,x]), response.dtype
print response[y2,x2], type(response[y2,x2]), response.dtype
print 2*(response[y,x] - min(response[y,x-1], response[y,x+1]))
print 2*(response[y2,x2] - min(response[y2,x2-1], response[y2,x2+1]))
प्रिंट:
इस कोड को देखते हैं?
0.959878861904 <type 'float'> float32
0.959879 <type 'numpy.float32'> float32
1.04306024313
1.04306030273
इस क्यों होता है !!! क्या यह एक बग है?
ठीक है, यहाँ का अनुरोध एक ही प्रकार और मूल्यों है कि मैं अपने मूल कार्य में प्रयोग किया जाता के साथ एक SSCCE है के रूप में
cpdef function():
cdef unsigned int x, y
max_loc2 = np.asarray([ 15., 25.], dtype=float)
cdef np.ndarray[np.float32_t, ndim=2] response2 = np.zeros((49,49), dtype=np.float32)
x, y = int(max_loc2[0]), int(max_loc2[1])
x2, y2 = int(max_loc2[0]), int(max_loc2[1])
response2[y,x] = 0.959878861904
response2[y,x-1] = 0.438348740339
response2[y,x+1] = 0.753262758255
print response2[y,x], type(response2[y,x]), response2.dtype
print response2[y2,x2], type(response2[y2,x2]), response2.dtype
print 2*(response2[y,x] - min(response2[y,x-1], response2[y,x+1]))
print 2*(response2[y2,x2] - min(response2[y2,x2-1], response2[y2,x2+1]))
प्रिंट
0.959878861904 <type 'float'> float32
0.959879 <type 'numpy.float32'> float32
1.04306024313
1.04306030273
मैं अजगर 2.7.3 का उपयोग 0.18 और msvc9 cython एक्सप्रेस
तुम सच में 'तुलना करने के लिए अहस्ताक्षरित int'' बनाम हस्ताक्षर किए int' चाहते हैं, बजाय 'अहस्ताक्षरित int' बनाम' की PyObject' या जो कुछ-कुछ और-Cython-चुनता है, आप की जरूरत है 'cdef int x2, y2'। – abarnert
अधिक महत्वपूर्ण बात: क्या आप हमें एक [एसएससीसीई] (http://sscce.org) दे सकते हैं जो समस्या का प्रदर्शन करता है, और सटीक संस्करण जो आप उपयोग कर रहे हैं। चूंकि जोश संस्करण के नमूने मानों का उपयोग करते हुए मेरे पास प्रत्येक संस्करण तक पहुंच है, इसलिए मुझे हमेशा int, unsigned int, और निर्दिष्ट नहीं किया जाता है (प्रासंगिक मामलों में अपेक्षित प्रिंट सटीक अंतर को छोड़कर)। – abarnert
आप इसके साथ सही हैं। अगर मैं cdef int x2 घोषित करता हूं, y2 मुझे यह अंतर नहीं मिलता है, तो वास्तव में यह cdef int या unsigned int बनाम पायओब्जेक्ट-या-जो कुछ भी है- साइथन-चुनता – martinako