Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy/Pandas优化向量操作_Python_Pandas_Numpy_Vector_Addition - Fatal编程技术网

Python Numpy/Pandas优化向量操作

Python Numpy/Pandas优化向量操作,python,pandas,numpy,vector,addition,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之间向量和的大小,如: 使用numpy/pandas实现此功能的最快和/或最具Python风格的方法是什么?您可以使用: 您可以将新的列幅值定义为向量的平方根之和,如下所示 import pandas as pd import numpy as np d = {'Vx':[1,2,1.5], '

假设我有一个数据帧df:

  Vx    Vy
0 1.00  1.00
1 2.00  3.00
2 1.50  1.75 
目标是创建一个新列
df['Vmagnitude']
,定义为Vx和Vy之间向量和的大小,如:

使用numpy/pandas实现此功能的最快和/或最具Python风格的方法是什么?

您可以使用:


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

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
一种快速的方法(例如,在3D游戏中的性能)是不使用sqrt,只将
x²+y²=x*x+y*y
存储在VMagnitureSquare列中,或者以您喜欢的方式存储。 在大多数情况下,对于进一步的计算,您可以直接使用它

这一切都归结为sqrt函数“慢”。
但这取决于您的使用情况。

当问题变得严重时,您可以尝试使用pandas eval。确保您安装了numexpr以获得增益(
pip install numexpr
),请参阅以了解其工作原理。如果已安装,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

另请参阅以了解如何提高性能

np.sqrt(df.Vx.pow(2)+df.Vy.pow(2))
np.sqrt(df.pow(2.sum(1))
,如果这是完整的答案。我不知道numpy内置了震级
import pandas

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

df.eval("vmag = sqrt(vx**2 + vy**2)", engine='numexpr', inplace=True)
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