#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
это список. Я отредактировал исправление. Попробуйте мою обновленную версию.