Przekonwertowałem do cytonu funkcję Pythona po prostu dodając niektóre typy i kompilując je. Otrzymywałem małe różnice liczbowe między wynikami funkcji python i cython. Po pracy odkryłem, że różnice wynikają z dostępu do tablicy numpy przy użyciu unsigned int zamiast int.Cython: unsigned int indices dla numpy array daje inny wynik
używałem unsigned int indeksów w celu przyspieszenia dostępu według: http://docs.cython.org/src/userguide/numpy_tutorial.html#tuning-indexing-further
i tak myślałem, że to nieszkodliwe używać niepodpisanych ints.
Zobacz ten kod:
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]))
drukuje:
0.959878861904 <type 'float'> float32
0.959879 <type 'numpy.float32'> float32
1.04306024313
1.04306030273
Dlaczego tak się dzieje !!! czy to błąd?
Ok, wnioskowane Oto SSCCE z tych samych typów i wartości, które użyłem w mojej pierwotnej funkcji
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]))
drukuje
0.959878861904 <type 'float'> float32
0.959879 <type 'numpy.float32'> float32
1.04306024313
1.04306030273
używam Python 2.7.3 Cython 0,18 i msvc9 express
Jeśli naprawdę chcesz porównać '' niepodpisany int' vs. podpisanej int', zamiast '' unsigned int' vs. PyObject'-albo-co-jeszcze-Cython-wybiera, trzeba 'cdef int x2, y2'. – abarnert
Co ważniejsze: Czy możesz podać nam [SSCCE] (http://sscce.org), który pokazuje problem i dokładne wersje, których używasz. Ponieważ każda wersja, do której mam dostęp przy użyciu przykładowych wartości JoshAdela, zawsze uzyskuję takie same wyniki dla int, unsigned int i unspecified (z wyjątkiem oczekiwanych różnic precyzji wydruku w odpowiednich przypadkach). – abarnert
masz rację. Jeśli deklaruję cdef int x2, y2, nie dostaję tej różnicy, tak naprawdę to jest cdef int lub unsigned int vs PyObject-lub-cokolwiek-else-Cython-wybiera – martinako