def polyfit2d(x, y, z, order=3, linear=False): """Two-dimensional polynomial fit. Based uppon code provided by Joe Kington. References: http://stackoverflow.com/questions/7997152/ python-3d-polynomial-surface-fit-order-dependent/7997925#7997925 """ ncols = (order + 1)**2 G = numpy.zeros((x.size, ncols)) ij = itertools.product(range(order+1), range(order+1)) for k, (i,j) in enumerate(ij): G[:,k] = x**i * y**j if linear & (i != 0.) & (j != 0.): G[:, k] = 0 m, _, _, _ = numpy.linalg.lstsq(G, z) return m def polyval2d(x, y, m): """Values to two-dimensional polynomial fit. Based uppon code provided by Joe Kington. """ order = int(numpy.sqrt(len(m))) - 1 ij = itertools.product(range(order+1), range(order+1)) z = numpy.zeros_like(x) for a, (i,j) in zip(m, ij): z += a * x**i * y**j return z