使用pandas数据框的行进行矩阵操作

6
我有一个pandas数据帧,其中包含三列,对应于对象位置的x、y和z坐标。我还有一个变换矩阵,可以将这些点旋转一定角度。以前,我循环遍历每行数据执行该变换,但我发现这非常耗时。现在,我只想一次性执行所有变换并将结果附加为额外的列。
我正在寻找此行代码的可行版本(它始终返回形状不匹配):
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)

因此,目标是使largest_haloes ['X_rot','Y_rot','Z_rot']的每一行都填充相应的largest_haloes ['X','Y','Z']行的旋转版本。如何在不循环行的情况下完成这个任务?我也尝试过df.dot,但它的文档不多,似乎无法实现我想要的效果。

1个回答

2
如果您指的是旋转矩阵乘法,您可以将两个矩阵转换为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)

1
这个方法可行!但是我花了一些时间才意识到,通过旋转矩阵的属性,np.dot(rot, point.T) 会以相同的角度但相反的方向旋转 np.dot(point, rot)。因此,我使用了您的第一个建议,但改变了参数的顺序以获得我需要的结果。 - Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接