Я пытаюсь написать скрипт с python/numpy/scipy для обработки данных, подгонки и построения графиков измерений магнитосопротивления, зависящих от угла. Я новичок в Python, получил код фрейма от своего научного руководителя и сумел добавить в фрейм несколько сотен строк кода. Через некоторое время я заметил, что в некоторых измерениях было несколько грубых ошибок, и, поскольку скрипт должен выполнять все манипуляции автоматически, я попытался замаскировать эти точки и подогнать кривую к незамаскированным точкам (кривая представляет собой квадрат синуса, наложенный на линейную функцию, так что numpy.ma.polyfit на самом деле не вариант). Однако после маскирования координат x и y проблемных точек подгонка по-прежнему будет учитывать их, даже если они не будут отображаться на графике. Пример упрощен, но происходит то же самое;
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, но я' m только строит 100 сразу, поэтому мне нужно будет взять маску части массива, которую я хочу построить, и назначить ее другому массиву, копируя значения массива в другой или устанавливая исходную маску на False) ? Спасибо за любые предложения