Numpy / Pandas优化矢量运算

时间:2019-03-22 16:20:18

标签: python pandas numpy vector addition

假设我有一个数据框df:

  Vx    Vy
0 1.00  1.00
1 2.00  3.00
2 1.50  1.75 

目标是创建一个新列df['Vmagnitude'],该列定义为Vx和Vy之间的矢量和的大小,例如in this picture

  Vx    Vy    Vmagnitude
0 1.00  1.00  1.41421
1 2.00  3.00  3.60555
2 1.50  1.75  2.30489

使用numpy / pandas实现此目的的最快和/或最Python方式是什么?

4 个答案:

答案 0 :(得分:1)

您可以使用np.linalg.norm

df["Vmagnitude"] = np.linalg.norm(df[["Vx", "Vy"]], axis=1)

答案 1 :(得分:1)

一种快速的方法(例如,在3D游戏中的性能)将是不使用sqrt,而仅将x²+y² = x*x + y*y存储在VMagnitudeSquare列中,或者您愿意。 在大多数情况下,您可以使用它来进行进一步的计算。

这一切都归结为sqrt功能“缓慢”。 但这取决于您的用法。

答案 2 :(得分:1)

当问题变大时,您可以尝试使用pandas eval。确保为获得收益(pip install numexpr安装numexpr,请参阅the numexpr readme here来了解其工作原理。如果已安装,Pandas只会将此功能包装到.eval方法中。

import pandas

df = pandas.DataFrame( random.random((5000000,2)), columns=('vx', 'vy'))

df.eval("vmag = sqrt(vx**2 + vy**2)", engine='numexpr', inplace=True)

我认为这是您最好的选择,numexpr利用了多线程

In [24]: %timeit np.linalg.norm( df[["vx", "vy"]], axis=1)
1 loop, best of 3: 266 ms per loop

In [25]: %timeit df.eval("sqrt(vx**2 + vy**2)", engine='python')
10 loops, best of 3: 144 ms per loop

In [26]: %timeit df.eval("sqrt(vx**2 + vy**2)", engine='numexpr')
10 loops, best of 3: 42 ms per loop

另请参阅this doc以提高性能。

答案 3 :(得分:0)

您可以将新的列幅度定义为矢量的平方根之和,如下所示

import pandas as pd
import numpy as np 


d = {'Vx':[1,2,1.5], 'Vy':[1,3,1.75]}
df = pd.DataFrame(data=d)
df['Magnitude'] = np.sqrt(df['Vx'].pow(2) + df['Vy'].pow(2))
print(df)

输出:

    Vx    Vy  Magnitude
0  1.0  1.00   1.414214
1  2.0  3.00   3.605551
2  1.5  1.75   2.304886