2016-10-13 10 views
4

オブジェクトの位置のx、y、z座標に対応する3つの列を含むpandasデータフレームがあります。これらの点をある角度だけ回転させる準備ができている変換行列もあります。私は以前、この変換を実行するデータフレームの各行をループしていましたが、それは非常に時間がかかることがわかりました。今すぐ変換を一度に実行し、その結果を追加の列として追加したいだけです。パンダデータフレームの行を使用した行列演算

私は(常に形状の不一致を返します)このラインの作業バージョンを探しています:

largest_haloes['X_rot', 'Y_rot', 'Z_rot'] = np.dot(rot,np.array([largest_haloes['X'], largest_haloes['Y'], largest_haloes['Z']]).T) 

ここでは最低限の作業例です:

from __future__ import division 
import math 
import pandas as pd 
import numpy as np 

def unit_vector(vector): 
    return vector/np.linalg.norm(vector) 


largest_haloes = pd.DataFrame() 
largest_haloes['X'] = np.random.uniform(1,10,size=30) 
largest_haloes['Y'] = np.random.uniform(1,10,size=30) 
largest_haloes['Z'] = np.random.uniform(1,10,size=30) 

normal = np.array([np.random.uniform(-1,1),np.random.uniform(-1,1),np.random.uniform(0,1)]) 
normal = unit_vector(normal) 

a = normal[0] 
b = normal[1] 
c = normal[2] 

rot = np.array([[b/math.sqrt(a**2+b**2), -1*a/math.sqrt(a**2+b**2), 0], [(a*c)/math.sqrt(a**2+b**2), b*c/math.sqrt(a**2+b**2), -1*math.sqrt(a**2+b**2)], [a, b, c]]) 

largest_haloes['X_rot', 'Y_rot', 'Z_rot'] = np.dot(rot,np.array([largest_haloes['X'], largest_haloes['Y'], largest_haloes['Z']]).T) 

ので、目標はそれぞれということです最大ハレルズ['X'、 'Y'、 'Z_rot']の行には、対応する行の最大ハルズ['X'、 'Y'、 'Z']の回転バージョンが設定されます。行をループせずにこれを行うにはどうすればよいですか?私もdf.dotを試しましたが、そこには多くのドキュメントがなく、私が望んだことをしていないようです。

答えて

1

ローテーションによる行列乗算を意味する場合。

あなたはnumpyの配列の両方に変換します。また、これは働いていた

x = pd.DataFrame(data=rot,index=['X','Y','Z']) 
rotated_df = largest_haloes.dot(x) 
+1

を行うことができます

lh = largest_haloes.values rotated_array = lh.dot(rot) 

としてそれを実行することができます!しかし、回転行列の性質によって、np.dot(rot、point.T)は同じ角度で回転されるが、np.dot(point、rot)の反対方向に回転することに気づくまでにはしばらく時間がかかりました。だからあなたの最初の提案を使ったが、必要なものを得るために議論の順序を変えた。 – Arnold

関連する問題