2016-09-05 19 views
3

私は再びそのような最も効率的な行乗算

df = pd.DataFrame(randint(2,size=(3,9))) 
df.values 
array([[0, 1, 0, 1, 1, 1, 0, 1, 1], 
     [1, 0, 1, 1, 1, 1, 0, 0, 1], 
     [0, 0, 0, 1, 0, 0, 1, 1, 0]]) 

として行列があると、この例の各行は、3つの3D座標を表し、例えば、以下の回転行列:

array([[ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00], 
     [ 0.00000000e+00, 1.00000000e+00, 0.00000000e+00], 
     [ -1.00000000e+00, 0.00000000e+00, 0.00000000e+00]]) 

できるだけ効率的にこれを行うには(本当の問題は、ところで、座標数百万を持っている)現在、私は私がしなければならないという、ややバッフル付き午前:

まずdf.reshape適用 - それぞれをそれを得るために

array([[0, 1, 0], 
     [1, 1, 1], 
     [0, 1, 1], 
     [1, 0, 1], 
     [1, 1, 1], 
     [0, 0, 1], 
     [0, 0, 0], 
     [1, 0, 0], 
     [1, 1, 0]]) 

そしてこの例では行三次元で構成され、[(X、Y、Z)、(X、Y、Z)、(X、Y、Z)]ように座標rotate to conventionには、上記の転置を意味するu_new = R \dot uが必要ですこれにより、列方向(すなわち、列方向)を取ることができる。回転行列との乗算を行う。

array([[0, 1, 0, 1, 1, 0, 0, 1, 1], 
     [1, 1, 1, 0, 1, 0, 0, 0, 1], 
     [0, 1, 1, 1, 1, 1, 0, 0, 0]]) 

その後、我々は乗算を行うことができます。

pd.DataFrame(dot(rotmat,df)).values 

array([[ 0.00e+00, 2.22e-16, 0.00e+00, 1.00e+00, 2.22e-16, 
      2.22e-16, 1.00e+00, 1.00e+00, 2.22e-16], 
     [ 1.00e+00, 0.00e+00, 1.00e+00, 1.00e+00, 1.00e+00, 
      1.00e+00, 0.00e+00, 0.00e+00, 1.00e+00], 
     [ 0.00e+00, -1.00e+00, 0.00e+00, -1.00e+00, -1.00e+00, 
     -1.00e+00, 2.22e-16, -1.00e+00, -1.00e+00]]) 

をそして元の形状にこれを取得するための全体のプロセスを逆に、他の目的に使用されます。

確かにこれを行うためのより効率的な方法が必要です(うまくいけば、回転行列を乱さないでください)?

+0

私はこれまで見てみましょう[ライブラリ](HTTP、あなたが幾何学的な代わりに変換パンダに対処するためにnumpyのを使用することをお勧めしたい://www.lfd.uci .edu /〜gohlke/code/transformations.py.html)。実際、スピードを探している場合は、データをGPUに転送して変換を行います。 – BPL

+0

確かに、私はパンダで変換を行っていません。ドットはnumpyから来て、それをパンダに保存します最後にデータフレーム。 – Astrid

+0

@BPLが書いたことは真です。あなたは効率について尋ねているので、すべての操作をnumpyで実行するのが最善です。データフレームの作成にはオーバーヘッドがあります。すべてのデータを並べ替えの少ない配列に保ち、追加のデータ構造にプッシュしたり引っ張ったりするコストを回避する方がはるかに効率的です。 – James

答えて

1

変換が完了するまで、これは決してデータフレームに触れてはなりません。

a = np.array([ 
     [0, 1, 0, 1, 1, 1, 0, 1, 1], 
     [1, 0, 1, 1, 1, 1, 0, 0, 1], 
     [0, 0, 0, 1, 0, 0, 1, 1, 0] 
    ]) 

rotmat = np.array([ 
     [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00], 
     [ 0.00000000e+00, 1.00000000e+00, 0.00000000e+00], 
     [ -1.00000000e+00, 0.00000000e+00, 0.00000000e+00] 
    ]) 

a.reshape(3, 3, -1).dot(rotmat).reshape(-1, 9) 

array([[ 0., 1., 0., -1., 1., 1., -1., 1., 0.], 
     [-1., 0., 1., -1., 1., 1., -1., 0., 0.], 
     [ 0., 0., 0., 0., 0., 1., 0., 1., 1.]]) 

df = pd.DataFrame(a.reshape(3, 3, -1).dot(rotmat).reshape(-1, 9)) 
df 

enter image description here

+0

「データフレームに触れないようにする」ための追加ポイントを取得する必要があります。 – Astrid

関連する問題