Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 4, 2022 09:58:41

testkorob
Зарегистрирован: 2022-09-21
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

python и numba. искажает вывод функции

мне нужно вычислить координаты и радиус окружности методом наименьших квадратов, для этого я написал функцию, которая принимает в качестве аргументов два списка с координатами дугиокружности Х и У, а возвращает координаты центра окружности и её радиус. всё работает правильно и хорошо, но слишком медленно, при попытке ускорения с помощью 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 всё работает

Офлайн

#2 Окт. 4, 2022 12:29:32

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

python и numba. искажает вывод функции

Попробуйте использовать Scipy



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Окт. 4, 2022 14:45:52

testkorob
Зарегистрирован: 2022-09-21
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

python и numba. искажает вывод функции

ZerG
спасибо, я разобрался, проблема действительно оказалась в переполнении, при большом количестве точек значение сумм оказываются огромные и они выходят за пределы int32, изменил на int64 и ошибки ушли, не понятно почему эта проблема вылезла только сейчас

а вопрос по поводу списков в numba Вы мне поможите решить? или мне новую тему создавать?

Офлайн

#4 Окт. 4, 2022 15:29:29

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

python и numba. искажает вывод функции

А что с ними не так?
https://numba.pydata.org/numba-doc/dev/reference/pysupported.html#list



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#5 Окт. 13, 2022 11:34:45

testkorob
Зарегистрирован: 2022-09-21
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

python и numba. искажает вывод функции

ZerG
А что с ними не так?
МНК подразумевает вычисление сумм, суммы квадратов и кубов, поэтому при больших значениях и их большом количестве запросто получаются числа больше 2147483647, в результате получаются отрицательные суммы и все расчёты катится коту под хвост, при использовании int64 у меня диапазон расширяется до 9223372036854775807, чего мне пока хватает
PS я использую numpy массивы, поэтому Ваша ссылка про списки тут не подходит

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version