def fixnans(Xin, method='spline'):
def fixrow(rowin, methodloc='spline'):
rowout = np.array(rowin)
unknown = isnan(rowin)
known = [not xx for xx in unknown]
tknown = np.nonzero(known)[0]
tunknown = np.nonzero(unknown)[0]
xknown = np.take(rowin, tknown)
if methodloc == 'spline':
if len(xknown) > 3:
sf = spinter.UnivariateSpline(tknown, xknown)
else:
sf = spinter.UnivariateSpline(tknown, xknown, k=len(xknown)-1)
rowout[tunknown] = sf(tunknown)
else:
raise ValueError('Provided interpolation method is not supported')
return rowout
Xinloc = deepcopy(Xin)
N = np.size(Xinloc, 0)
M = np.size(Xinloc, 1)
Xout = np.zeros([N, M])
with warnings.catch_warnings():
warnings.simplefilter('ignore')
for i in range(N):
sumnans = sum(isnan(Xinloc[i]))
notnans = [x for x in Xinloc[i] if not isnan(x)]
if sumnans < M - 1:
if math.isnan(Xinloc[i, 0]):
Xinloc[i, 0] = notnans[0]
if math.isnan(Xinloc[i, -1]):
Xinloc[i, -1] = notnans[-1]
Xout[i] = fixrow(Xinloc[i], method)
elif sumnans == M - 1:
Xout[i] = [notnans[0] for x in range(M)]
return Xout