def fit_ellipse(pty, ptx):
    'Fit an\n     \n    inspired from \n    http://nicky.vanforeest.com/misc/fitEllipse/fitEllipse.html\n    \n    :param pty: point coordinates in the slow dimension (y)\n    :param ptx: point coordinates in the fast dimension (x)\n    '
    x = ptx[:, numpy.newaxis]
    y = pty[:, numpy.newaxis]
    D = numpy.hstack(((x * x), (x * y), (y * y), x, y, numpy.ones_like(x)))
    S = numpy.dot(D.T, D)
    C = numpy.zeros([6, 6])
    C[(0, 2)] = C[(2, 0)] = 2
    C[(1, 1)] = (- 1)
    (E, V) = numpy.linalg.eig(numpy.dot(numpy.linalg.inv(S), C))
    n = numpy.argmax(numpy.abs(E))
    res = V[:, n]
    (b, c, d, f, g, a) = ((res[1] / 2), res[2], (res[3] / 2), (res[4] / 2), res[5], res[0])
    num = ((b * b) - (a * c))
    x0 = (((c * d) - (b * f)) / num)
    y0 = (((a * f) - (b * d)) / num)
    if (b == 0):
        if (a > c):
            angle = 0
        else:
            angle = (numpy.pi / 2)
    elif (a > c):
        angle = (numpy.arctan2((2 * b), (a - c)) / 2)
    else:
        angle = ((numpy.pi / 2) + (numpy.arctan2((2 * b), (a - c)) / 2))
    up = (2 * ((((((a * f) * f) + ((c * d) * d)) + ((g * b) * b)) - (((2 * b) * d) * f)) - ((a * c) * g)))
    down1 = (((b * b) - (a * c)) * (((c - a) * numpy.sqrt((1 + (((4 * b) * b) / ((a - c) * (a - c)))))) - (c + a)))
    down2 = (((b * b) - (a * c)) * (((a - c) * numpy.sqrt((1 + (((4 * b) * b) / ((a - c) * (a - c)))))) - (c + a)))
    res1 = numpy.sqrt((up / down1))
    res2 = numpy.sqrt((up / down2))
    return Ellipse(y0, x0, angle, max(res1, res2), min(res1, res2))
Fit an
 
inspired from 
http://nicky.vanforeest.com/misc/fitEllipse/fitEllipse.html

:param pty: point coordinates in the slow dimension (y)
:param ptx: point coordinates in the fast dimension (x)
def fit_ellipse(pty, ptx):
    'Fit an\n     \n    inspired from \n    http://nicky.vanforeest.com/misc/fitEllipse/fitEllipse.html\n    \n    :param pty: point coordinates in the slow dimension (y)\n    :param ptx: point coordinates in the fast dimension (x)\n    '
    x = ptx[:, numpy.newaxis]
    y = pty[:, numpy.newaxis]
    D = numpy.hstack(((x * x), (x * y), (y * y), x, y, numpy.ones_like(x)))
    S = numpy.dot(D.T, D)
    C = numpy.zeros([6, 6])
    C[(0, 2)] = C[(2, 0)] = 2
    C[(1, 1)] = (- 1)
    (E, V) = numpy.linalg.eig(numpy.dot(numpy.linalg.inv(S), C))
    n = numpy.argmax(numpy.abs(E))
    res = V[:, n]
    (b, c, d, f, g, a) = ((res[1] / 2), res[2], (res[3] / 2), (res[4] / 2), res[5], res[0])
    num = ((b * b) - (a * c))
    x0 = (((c * d) - (b * f)) / num)
    y0 = (((a * f) - (b * d)) / num)
    if (b == 0):
        if (a > c):
            angle = 0
        else:
            angle = (numpy.pi / 2)
    elif (a > c):
        angle = (numpy.arctan2((2 * b), (a - c)) / 2)
    else:
        angle = ((numpy.pi / 2) + (numpy.arctan2((2 * b), (a - c)) / 2))
    up = (2 * ((((((a * f) * f) + ((c * d) * d)) + ((g * b) * b)) - (((2 * b) * d) * f)) - ((a * c) * g)))
    down1 = (((b * b) - (a * c)) * (((c - a) * numpy.sqrt((1 + (((4 * b) * b) / ((a - c) * (a - c)))))) - (c + a)))
    down2 = (((b * b) - (a * c)) * (((a - c) * numpy.sqrt((1 + (((4 * b) * b) / ((a - c) * (a - c)))))) - (c + a)))
    res1 = numpy.sqrt((up / down1))
    res2 = numpy.sqrt((up / down2))
    return Ellipse(y0, x0, angle, max(res1, res2), min(res1, res2))