Я пытаюсь написать скрипт с python / numpy / scipy для манипулирования данными, подгонки и построения графиков зависимых от угла измерений магнитосопротивления. Я новичок в Python, получил код фрейма от моего доктора философии и сумел добавить несколько сотен строк кода в фрейм. Через некоторое время я заметил, что в некоторых измерениях было несколько грубых ошибок, и, поскольку скрипт должен выполнять все манипуляции автоматически, я попытался замаскировать эти точки и подогнать кривую к немаскированным точкам (кривая представляет собой квадрат синуса, наложенный на линейную функцию, так что numpy .ma.polyfit на самом деле не является выбором). Однако после маскировки координат x и y проблемных c точек фитинг все равно будет учитывать их, даже если они не будут отображаться на графике. Пример упрощен, но происходит то же самое:
import numpy.ma as ma
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def Funk(x, k, y0):
return k*x + y0
fig,ax= plt.subplots()
x=ma.masked_array([1,2,3,4,5,6,7,8,9,10],mask=[0,0,0,0,0,0,1,1,1,1])
y=ma.masked_array([1,2,3,4,5,30,35,40,45,50], mask=[0,0,0,0,0,1,1,1,1,1])
fitParamsFunk, fitCovariancesFunk = curve_fit(Funk, x, y)
ax.plot(x, Funk(x, fitParamsFunk[0], fitParamsFunk[1]))
ax.errorbar(x, y, yerr = None, ms=3, fmt='-o')
plt.show()
Вторая половина точек замаскирована и не показана на графике, но все еще учитывается.
При написании поста я понял, что могу сделать это:
def Funk(x, k, y0):
return k*x + y0
fig,ax= plt.subplots()
x=np.array([1,2,3,4,5,6,7,8,9,10])
y=np.array([1,2,3,4,5,30,35,40,45,50])
mask=np.array([0,0,0,0,0,1,1,1,1,1])
fitParamsFunk, fitCovariancesFunk = curve_fit(Funk, x[mask], y[mask])
ax.plot(x, Funk(x, fitParamsFunk[0], fitParamsFunk[1]))
ax.errorbar(x, y, yerr = None, ms=3, fmt='-o')
plt.show()
Что я на самом деле хотел
Я думаю, что scipy curve_fit не предназначен иметь дело с замаскированными массивами, но я все еще хотел бы знать, есть ли обходной путь для этого (мне нужно работать с замаскированными массивами, потому что число точек данных> 10e6, но я заговариваю только 100 сразу, поэтому я потребуется ли взять маску части массива, которую я хочу построить, и назначить ее другому массиву, копируя значения массива в другой или устанавливая исходную маску в False)? Спасибо за любые предложения