def angle_between_vectors(v1, v2): """ Calculates the angle between <v1> and <v2>. The result is in the range [0, pi] On degenerate input (any of the vectors of norm 0) will raise ValueError. """ v1 = Vector(v1, copy=False) v2 = Vector(v2, copy=False) n1 = v1.norm() n2 = v2.norm() if n1 == 0 or n2 == 0: raise ValueError("Can't calculate angle between zero length vectors !") cos_a = v1.dot(v2) / (n1 * n2) cos_a = max(-1.0, min(1.0, cos_a)) return math.acos(cos_a)