2016-11-26 2 views
2

私は固定数(p)の2D点で定義される(n)幾何学的形状のセットを持っています。これらの形状は独立していますが、効率の理由から、私は時間を単一の配列に格納しました。これらの図形のスケーリングや平行移動は簡単ですが、回転させたいのですが、その方法はわかりません。私はnp.tensordotが私の友人だと思っていますが、正しく使用する方法が見つけられません。 Pと整列Rと入力配列からの残りの軸オフsum-reducing一つずつ -一度に複数の2次元回旋

n = 100 # Number of shape 
p = 4 # Points per shape 
P = np.random.uniform(0, 1, (n, p, 2)) 

# Scaling 
S = 0.5*np.ones(n) 
P *= S 

# Translating 
T = np.random.uniform(0, 1, (n, 1, 2)) 
P += T 

# Rotating 
A = np.random.uniform(0, 2*np.pi, n) 
cosA, sinA = np.cos(A), np.sin(A) 

R = np.empty((n,2,2)) 
R[:,0,0] = cosA 
R[:,1,0] = sinA 
R[:,0,1] = -sinA 
R[:,1,1] = cosA 

np.tensordot(P, R, axes=???) 
+0

出力配列の形状だろうか? – Divakar

+0

形状はPと同じでなければなりません(Pの各点が回転します) –

答えて

2

2つの配列の間の第1の軸を維持していると思われます。したがって、np.einsumを使用すると、軸の位置合わせの基準が可能になります。

最後の軸をPから使用しています。さて、あなたは回転計算のためsum-reductionを失っているRのどの軸に応じて、これらの一つは仕事をしなければならない -

np.einsum('ijk,ilk->ijl',P,R) # Using last dim of R for sum-reduction 
np.einsum('ijk,ikl->ijl',P,R) # Using second dim of R for sum-reduction 
+0

ありがとう!最初と最後のオプションの間の幾何学的解釈は何でしょうか? –

+0

@NicolasRougierまあ、私はここで関連するようなジオメトリについてはわからないコード部分についてお手伝いします。だから、私はそれについてコメントすることはできません、申し訳ありません。 – Divakar

+0

それから私は実験します。再度、感謝します。 –

関連する問題