2016-10-13 3 views
4

Ich habe einen Pandas-Datenrahmen, der drei Spalten enthält, die den x-, y- und z-Koordinaten für Positionen von Objekten entsprechen. Ich habe auch eine Transformationsmatrix, die bereit ist, diese Punkte um einen bestimmten Winkel zu drehen. Ich hatte zuvor jede Zeile des Datenrahmens durchlaufen, der diese Transformation durchgeführt hat, aber ich fand, dass das sehr, sehr zeitaufwendig ist. Jetzt möchte ich nur die Transformationen auf einmal durchführen und die Ergebnisse als zusätzliche Spalten anhängen.Matrixoperationen mit Reihen von Pandas-Datenrahmen

Ich bin für eine funktionierende Version dieser Linie suchen (die immer eine Form Mismatch zurückgibt):

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

Hier ist ein Mindestarbeitsbeispiel:

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) 

So ist das Ziel, dass jeder ist row of largest_haloes ['X_rot', 'Y_rot', 'Z_rot'] sollte mit einer gedrehten Version der entsprechenden Zeile von largest_haloes ['X', 'Y', 'Z'] gefüllt werden. Wie kann ich das tun, ohne Zeilen zu durchlaufen? Ich habe auch versucht, df.dot, aber es gibt nicht viel Dokumentation darüber und es schien nicht zu tun, was ich wollte.

Antwort

1

Wenn Sie Matrixmultiplikation durch Rotation meinen.

Sie können konvertieren beide numpy Arrays und führen Sie es als

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

Sie auch

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

Das funktionierte! Es dauerte jedoch einige Zeit, bis ich erkannte, dass durch die Eigenschaften der Rotationsmatrizen np.dot (rot, point.T) um den gleichen Winkel gedreht wird, aber in die entgegengesetzte Richtung von np.dot (Punkt, rot). Also habe ich Ihren ersten Vorschlag verwendet, aber die Reihenfolge der Argumente geändert, um zu bekommen, was ich brauchte. – Arnold