Python 具有数据帧行的矩阵运算

Python 具有数据帧行的矩阵运算,python,pandas,matrix,dataframe,Python,Pandas,Matrix,Dataframe,我有一个pandas数据框,它包含三列,分别对应于对象位置的x、y和z坐标。我还有一个变换矩阵,可以将这些点旋转一定角度。我以前在执行此转换时循环了数据帧的每一行,但我发现这非常非常耗时。现在我只想一次执行所有转换,并将结果附加为附加列 我正在寻找该行的工作版本(总是返回形状不匹配): 下面是一个最低限度的工作示例: from __future__ import division import math import pandas as pd import numpy as np def un

我有一个pandas数据框,它包含三列,分别对应于对象位置的x、y和z坐标。我还有一个变换矩阵,可以将这些点旋转一定角度。我以前在执行此转换时循环了数据帧的每一行,但我发现这非常非常耗时。现在我只想一次执行所有转换,并将结果附加为附加列

我正在寻找该行的工作版本(总是返回形状不匹配):

下面是一个最低限度的工作示例:

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']都应该用相应行最大晕['X'、'Y'、'Z']的旋转版本填充。如何在不循环行的情况下执行此操作?我也尝试过df.dot,但是没有太多的文档,它似乎没有达到我想要的效果。

如果你是指旋转矩阵乘法

您可以将两者转换为numpy数组并按如下方式执行

lh = largest_haloes.values
rotated_array = lh.dot(rot)
你也可以

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

这成功了!然而,我花了一段时间才意识到,根据旋转矩阵的性质,np.dot(rot,point.T)的旋转角度与np.dot(point,rot)相同,但方向相反。所以我使用了你的第一个建议,但改变了论点的顺序,以得到我所需要的。
x = pd.DataFrame(data=rot,index=['X','Y','Z'])
rotated_df = largest_haloes.dot(x)