# Quaternions in Python

Johann Hibschman johann at physics.berkeley.edu
Sat Oct 6 22:05:19 CEST 2001

```>>>>> "Erik" == Erik Max Francis <max at alcyone.com> writes:

Erik> That's perfectly valid, but I don't think it's what the
Erik> poster I responded to meant.  He meant encoding the
Erik> transform represented by the quarternion into a matrix.

But Pauli spin matrices are matrices!  But I get the point that you're
thinking of real matrices.  It doesn't mean that NumPy doesn't make
this easy.  You could do something like:

import Numeric

class Quat:
def __init__(self, matrix):
self.matrix = matrix

# Extracting components (Is this right?)
def c0(self):
m = self.matrix
return (m[0][0]+m[1][1])/2.0
def c1(self):
m = self.matrix
return (m[0][1]+m[1][0])/2.0
def c2(self):
m = self.matrix
return 1.0j*(m[0][1]-m[1][0])/2.0
def c3(self):
m = self.matrix
return (m[0][0]-m[1][1])/2.0

# Math
def __mul__(self, other):
if hasattr(other, 'matrix'):
return Quat(Numeric.matrixmultiply(self.matrix, other.matrix))
else:
return Quat(self.matrix * other)
def __rmul__(self, other):
return Quat(other * self.matrix)
if hasattr(other, 'matrix'):
return Quat(self.matrix + other.matrix)
else:
return Quat(self.matrix + other)
return Quat(other + self.matrix)
def __sub__(self, other):
if hasattr(other, 'matrix'):
return Quat(self.matrix - other.matrix)
else:
return Quat(self.matrix - other)
def __rsub__(self, other):
return Quat(other - self.matrix)

# Basis
s0 = Quat(Numeric.array([[1.0, 0.0], [0.0, 1.0]]))
s1 = Quat(Numeric.array([[0.0, 1.0], [1.0, 0.0]]))
s2 = Quat(Numeric.array([[0.0, -1.0j], [1.0j, 0.0]]))
s3 = Quat(Numeric.array([[1.0, 0.0], [0.0, -1.0]]))

# Create from components.
def q(i, j, k, l):
"Create a quaternion from components."
return s0*i+s1*j+s2*k+s3*l

```