Интерполяция с помощью np.polyfit()

#python #numpy #interpolation

#python #numpy #интерполяция

Вопрос:

Я работаю с данными, которые я хотел бы построить и интерполировать. Часть построения графика работает очень хорошо. Если точки рассеяния на графике будут соединены, это даст простую гиперболическую кривую, например 1 / x. Итак, что я хочу сделать, это интерполировать данные, чтобы получить кривую, подобную 1 / x: y_interp = a * 1 / x. Это то, что я сделал до сих пор, чтобы добраться туда:

 # define x and y
x_scatter = df_fc['NLPC']*100
ref_line = df_fc.loc[df_fc.index == 1]
y_ref = ref_line['WAR026'].squeeze()
y_scatter = df_fc['WAR026']/y_ref

# scatter the relevant data
ax.scatter(x_scatter, y_scatter, facecolor='black', edgecolor='black')

# defining the values to be interpolated
z = [1/x for x in df_fc['NLPC']]

# interpolation
coeffs = np.polyfit(z, y_scatter, 1)
function = np.poly1d(coeffs)

# define new x_range
min_x = min(df_fc['NLPC']*100)
max_x = max(df_fc['NLPC']*100)
new_x_range = (np.arange(min_x , max_x , 1)).tolist()

values = function(1/new_x_range)

 

Но как только я запускаю код, появляется сообщение об ошибке. Сообщение об ошибке гласит

 numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares
 

Похоже, что polyfit создает сообщение об ошибке, но я не знаю, как справиться с этим сообщением.
Не могли бы вы, пожалуйста, помочь мне понять сообщение об ошибке или показать мне способ получить интерполяцию 1 / x-кривой?

С уважением, Мэлс

Ответ №1:

Похоже, у вас может быть ноль в этом диапазоне, и вы получаете NaN или inf в качестве одного из чисел, а numpy жалуется.

После строки z = [1/x for x in df_fc['NLPC']] добавьте:

z = [x for x in z if np.isfinite(x)]

Если это не сработает, у вас может возникнуть проблема с нехваткой системной памяти.

Комментарии:

1. спасибо за вашу быструю помощь. Я реализовал это и запустил код на Python 3.8. Результат гласит TypeError: only integer scalar arrays can be converted to a scalar index . Я не думаю, что это проблема системной памяти, должно быть достаточно места.

2. @mels Я использовал функцию numpy, которой нет в списках python; На тот момент я не понимал, что z это список. Я отредактировал исправление. Попробуйте мою обновленную версию.