Numpy / Pandas оптимизировал векторные операции - PullRequest
0 голосов
/ 22 марта 2019

Предположим, у меня был кадр данных::

  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?

Ответы [ 4 ]

1 голос
/ 22 марта 2019

Когда проблема становится большой, вы можете попробовать использовать pandas eval.Убедитесь, что вы установили Numberxpr для коэффициентов усиления (pip install numexpr), смотрите readme Numberxpr здесь , чтобы увидеть, как это работает.Если установлено, 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)

Я думаю, что это ваша лучшая ставка, Numberxpr использует многопоточность

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

Также см. этот документ для повышения производительности.

1 голос
/ 22 марта 2019

Быстрый способ (например, производительность в 3D-играх) - не использовать sqrt и хранить только x²+y² = x*x + y*y в столбце VMagnitudeSquare или как вам угодно. В большинстве случаев для дальнейших расчетов вы можете просто использовать это.

Все это сводится к тому, что функция sqrt работает медленно. Но это зависит от вашего использования.

1 голос
/ 22 марта 2019

Вы можете использовать np.linalg.norm :

df["Vmagnitude"] = np.linalg.norm(df[["Vx", "Vy"]], axis=1)
0 голосов
/ 22 марта 2019

Вы можете определить новую величину столбца как сумму квадратных корней векторов, как показано ниже

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...