私はバッチバージョンnumpyの:四元数の乗算のバッチバージョンを作る
def quat_multiply(self, quaternion0, quaternion1):
x0, y0, z0, w0 = np.split(quaternion0, 4, 1)
x1, y1, z1, w1 = np.split(quaternion1, 4, 1)
result = np.array((
x1*w0 + y1*z0 - z1*y0 + w1*x0,
-x1*z0 + y1*w0 + z1*x0 + w1*y0,
x1*y0 - y1*x0 + z1*w0 + w1*z0,
-x1*x0 - y1*y0 - z1*z0 + w1*w0), dtype=np.float64)
return np.transpose(np.squeeze(result))
この関数は(?、4)形状でquaternion1とquaternion0を扱うには、以下の機能
def quaternion_multiply(quaternion0, quaternion1):
"""Return multiplication of two quaternions.
>>> q = quaternion_multiply([1, -2, 3, 4], [-5, 6, 7, 8])
>>> numpy.allclose(q, [-44, -14, 48, 28])
True
"""
x0, y0, z0, w0 = quaternion0
x1, y1, z1, w1 = quaternion1
return numpy.array((
x1*w0 + y1*z0 - z1*y0 + w1*x0,
-x1*z0 + y1*w0 + z1*x0 + w1*y0,
x1*y0 - y1*x0 + z1*w0 + w1*z0,
-x1*x0 - y1*y0 - z1*z0 + w1*w0), dtype=numpy.float64)
を形質転換しました。今私は関数が(?、?、4)のような次元の任意の数を処理できるようにしたい。これを行う方法?
あなたは自分を救うことができます最後の次元を前面に持ってくるために 'np.rollaxis'を使うのではなく、配列を転置するだけでコピーを作成できます。 –
@ali_m 'np.rollaxis'もビューを作成しませんか? – Divakar
申し訳ありませんが、あなたは正しいです(私は恐らく 'np.roll'と混同していたでしょう)。しかし、Transposeはやや速いです。 –