Criação de quaternion aleatório uniforme e multiplicação de dois quaternions

Eu tenho uma função python (NumPy) que cria um quaternion aleatório uniforme. Gostaria de obter a multiplicação de dois quaterniões como matriz retornada bidimensional a partir da mesma ou de outra função. A fórmula da multiplicação de quaterniões no meu caso recente é Q1 * Q2 e Q2 * Q1. Aqui,Q1=(w0, x0, y0, z0) eQ2=(w1, x1, y1, z1) são dois quaternions. A saída esperada de multiplicação de dois quaterniões (como matriz retornada 2-d) deve ser

return([-x1*x0 - y1*y0 - z1*z0 + w1*w0, x1*w0 + y1*z0 - z1*y0 +
    w1*x0, -x1*z0 + y1*w0 + z1*x0 + w1*y0, x1*y0 - y1*x0 + z1*w0 +
    w1*z0])

Alguém pode me ajudar por favor? Meus códigos estão aqui:

def randQ(N):
    #Generates a uniform random quaternion
    #James J. Kuffner 2004 
    #A random array 3xN
    s = random.rand(3,N)
    sigma1 = sqrt(1.0 - s[0])
    sigma2 = sqrt(s[0])
    theta1 = 2*pi*s[1]
    theta2 = 2*pi*s[2]
    w = cos(theta2)*sigma2
    x = sin(theta1)*sigma1
    y = cos(theta1)*sigma1
    z = sin(theta2)*sigma2
    return array([w, x, y, z])

questionAnswers(2)

yourAnswerToTheQuestion