Я преобразовал в cython функцию python, просто добавив некоторые типы и скомпилировав их. Я получал небольшие числовые различия между результатами функций python и cython. После некоторой работы я обнаружил, что различия связаны с доступом к массиву numpy с использованием unsigned int вместо int.Cython: unsigned int индексы для массивов numpy дают отличный результат
Я использую неподписанных 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
Почему это случилось !!! это ошибка?
Ok, в соответствии с просьбой здесь является 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
Я использую Python 2.7.3 Cython 0,18 и msvc9 экспресс
Если вы действительно хотите сравнить 'неподписанный int' против' подписанного int', вместо 'беззнаковое int' против' PyObject' или-то, что-то еще-Cython-выбирает, что вам нужно 'CDEF int x2, y2'. – abarnert
Что еще более важно: можете ли вы дать нам [SSCCE] (http://sscce.org), демонстрирующий проблему, и точные версии, которые вы используете. Поскольку у каждой версии, к которой я имею доступ, с использованием значений JoshAdel, я всегда получаю одинаковые результаты для int, unsigned int и unspecified (за исключением ожидаемых различий в точности печати в соответствующих случаях). – abarnert
Вы правы с этим. Если я объявляю cdef int x2, y2, я не получаю эту разницу, так что действительно, это cdef int или unsigned int vs PyObject-or-whatever-else-Cython-chooses – martinako