2016-03-30 15 views
2

我々は3 x 3回転行列Rを持っている場合、それは、v3 x Nアレイ乗算することができる - N列ベクトルの配列 - 回転の新しい3 x Nアレイを生成するためにこのようなベクターは、:回転行列の配列によってベクターのアレイの回転

v_rotated = R.dot(v) 

は、今、私たちはN x M x 3配列、私はN異なる3 x 3回転行列(ベクトルの各「行」のための1つの回転行列)で回転したいNMベクトルを、持っていると仮定します。これはループでは簡単ですが、より高速でコンパクトな(ベクトル化された)方法があります。 numpydotまたはtensorproduct?ループの実装のための

例コード:

from numpy import cos, sin, array, pi, linspace, random 

# 100 different rotation matrices: 
R = [array([[1, 0, 0], [0, cos(theta), -sin(theta)], [0, sin(theta), cos(theta)]]) for theta in linspace(0, pi, 100)] 
# 100 x 200 random vectors: 
v = random.random((100, 200, 3)) 

# rotate vectors in loop: 
rotated_v = array([R_.dot(v_.T).T for R_, v_ in zip(R, v)]) 
+0

シェア愚かコード我々はすべての提案された解決策に戻って確認することができるようにあなたは、実装している場合? – Divakar

+0

@Divakarはルフィコードを追加しました(もちろんおもちゃの例) – sulkeh

答えて

5

はあなたがnp.einsum

import numpy as np 
rotated_v = np.einsum('lij, lkj->lki', R, v) 

lを使用することができ、 のはv.shape(N, M, 3)R.shape(N, 3, 3)であると仮定するがNiと上の指標でありますj3x3のインデックスです。rotatイオン寸法、kMの指数です。

私はあなたの次のようにして、私の結果と一致しました:

>>> print np.allclose(my_rotated_v, your_rotated_v) 
True