Найти - Пользователи
Полная версия: python и numba. искажает вывод функции
Начало » Python для новичков » python и numba. искажает вывод функции
1
testkorob
мне нужно вычислить координаты и радиус окружности методом наименьших квадратов, для этого я написал функцию, которая принимает в качестве аргументов два списка с координатами дугиокружности Х и У, а возвращает координаты центра окружности и её радиус. всё работает правильно и хорошо, но слишком медленно, при попытке ускорения с помощью numba припост скорости получился существенный, но результаты оказываются не верные
 @numba.njit()
def MNK_circle(x,y):
    n = len(x)
    x_kv = np.square(x)
    y_kv = np.square(y)
    sum_x_kv = int(np.sum(x_kv))
    sum_y_kv = int(np.sum(y_kv))
    sum_x = int(np.sum(x))
    sum_y = int(np.sum(y))
    sum_x_kub = int(np.sum(np.power(x, 3)))
    sum_y_kub = int(np.sum(np.power(y, 3)))
    sum_xy = int(np.sum(x * y))
    sum_x_y_kv = int(np.sum(x * y_kv))
    sum_y_x_kv = int(np.sum(y * x_kv))
    N11 = 2*(sum_x_kv-(sum_x*sum_x)/n)
    N12 = 2*(sum_xy-(sum_x*sum_y)/n)
    W1 = sum_x_kub+sum_x_y_kv-((sum_x_kv*sum_x)/n)-((sum_y_kv*sum_x)/n)
    N21 = 2*(sum_xy-((sum_x*sum_y)/n))
    N22 = 2*(sum_y_kv-((sum_y*sum_y)/n))
    W2 = sum_y_x_kv+sum_y_kub-((sum_x_kv*sum_y)/n)-((sum_y_kv * sum_y)/n)
    detN = N11*N22 - N12*N21
    x0 = (W1*N22-W2*N12)/detN
    y0 = (W2*N11-W1*N21)/detN
    r = math.sqrt(x0*x0 + y0*y0 + (sum_x_kv + sum_y_kv - 2*(x0*sum_x+y0*sum_y))/n)
    return int(x0+0.5), int(y0+0.5), int(r+0.5)
предполагаю что проблемы вызваны использованием numpy массивов, что то мне кажется что в них происходит переполнение, но почему без numba всё работает
ZerG
Попробуйте использовать Scipy
testkorob
ZerG
спасибо, я разобрался, проблема действительно оказалась в переполнении, при большом количестве точек значение сумм оказываются огромные и они выходят за пределы int32, изменил на int64 и ошибки ушли, не понятно почему эта проблема вылезла только сейчас

а вопрос по поводу списков в numba Вы мне поможите решить? или мне новую тему создавать?
ZerG
А что с ними не так?
https://numba.pydata.org/numba-doc/dev/reference/pysupported.html#list
testkorob
ZerG
А что с ними не так?
МНК подразумевает вычисление сумм, суммы квадратов и кубов, поэтому при больших значениях и их большом количестве запросто получаются числа больше 2147483647, в результате получаются отрицательные суммы и все расчёты катится коту под хвост, при использовании int64 у меня диапазон расширяется до 9223372036854775807, чего мне пока хватает
PS я использую numpy массивы, поэтому Ваша ссылка про списки тут не подходит
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB