Size: a a a

Python для анализа данных

2021 January 11

O

Oleh in Python для анализа данных
привет!
Помогите пожалуйста разобраться, как я могу применить векторизацию. В рамках саморазвлечения и самообразования пытаюсь с нуля написать на питоне вычислительное решение n-body problem (для простоты — в двухмерном пространстве).
Есть numpy-array Nx5, который представляет координаты, массу и вектор движения N точек. Чтобы рассчитать, какие силы влияют на каждый объект в данный момент времени, мне нужно поэлементно произвести математические операции каждого элемента с каждым.  если это делать “в лоб”,  то при N=300 просчет “каждый для каждого” на моей машине занимает почти две секунды. А поскольку мне нужно провести много итераций этой функции, возник вопрос как можно оптимизировать следующий код:
obj = np.array(<Nxm>) # исходный объект содержащий координаты и т.д.
       results = np.zeros((len(obj), 2)) # объект, в который будут записываься результаты вычислений
       for i, pt_i in enumerate(obj):
           for j, pt_j in enumerate(obj):
               if i <= j:
                   continue
               iter_res = calculate_forces(pt_i[0:3], pt_j[0:3]) # функция производит несколько математических операций над двумя массивами 1х3, результат вычисления для пары элементов — array 1x2
               results[i] += list(iter_res)
               results[j] -= list(iter_res)

быстрый гугл дал очень много разных вариантов встроенных функций numpy, и я не вполне могу быстро разобраться какой из них мне может подойти а какой нет. Заранее спасибо!
источник

R

Ruslan in Python для анализа данных
Andrey Denisov
Угу
И также непонятно - кто всё-таки победил?! 😂
😂😂😂😂😂😂
источник

K

KiKo in Python для анализа данных
Oleh
привет!
Помогите пожалуйста разобраться, как я могу применить векторизацию. В рамках саморазвлечения и самообразования пытаюсь с нуля написать на питоне вычислительное решение n-body problem (для простоты — в двухмерном пространстве).
Есть numpy-array Nx5, который представляет координаты, массу и вектор движения N точек. Чтобы рассчитать, какие силы влияют на каждый объект в данный момент времени, мне нужно поэлементно произвести математические операции каждого элемента с каждым.  если это делать “в лоб”,  то при N=300 просчет “каждый для каждого” на моей машине занимает почти две секунды. А поскольку мне нужно провести много итераций этой функции, возник вопрос как можно оптимизировать следующий код:
obj = np.array(<Nxm>) # исходный объект содержащий координаты и т.д.
       results = np.zeros((len(obj), 2)) # объект, в который будут записываься результаты вычислений
       for i, pt_i in enumerate(obj):
           for j, pt_j in enumerate(obj):
               if i <= j:
                   continue
               iter_res = calculate_forces(pt_i[0:3], pt_j[0:3]) # функция производит несколько математических операций над двумя массивами 1х3, результат вычисления для пары элементов — array 1x2
               results[i] += list(iter_res)
               results[j] -= list(iter_res)

быстрый гугл дал очень много разных вариантов встроенных функций numpy, и я не вполне могу быстро разобраться какой из них мне может подойти а какой нет. Заранее спасибо!
Itertools.combinations?
источник

PZ

Pavel Zheltouhov in Python для анализа данных
KiKo
Itertools.combinations?
не, ну там сложна. всякие scipy.linalg.blas гугл предлагает. парой встроенных функций не ускорить
источник

PZ

Pavel Zheltouhov in Python для анализа данных
https://github.com/pmocz/nbody-python/blob/master/nbody.py
вроде работает.
суммы, квадраты и пр векторные вычисления.
источник

PZ

Pavel Zheltouhov in Python для анализа данных
в принципе, довольно быстро считает, если отключить в этом коде постоянную отрисовку
источник

O

Oleh in Python для анализа данных
Спасибо! В этом скрипте, к сожалению для меня, много дополнительных финтов и не очень понятно, что там шаг за шагом происходит. Поэтому я беру другое решение для трех объектов в лоб, и допиливаю, чтобы оно работало для большего количества тел
источник

PZ

Pavel Zheltouhov in Python для анализа данных
Oleh
Спасибо! В этом скрипте, к сожалению для меня, много дополнительных финтов и не очень понятно, что там шаг за шагом происходит. Поэтому я беру другое решение для трех объектов в лоб, и допиливаю, чтобы оно работало для большего количества тел
Ну так а что вы саму математику запихнули в функцию и не показываете?
источник

O

Oleh in Python для анализа данных
Pavel Zheltouhov
Ну так а что вы саму математику запихнули в функцию и не показываете?
а там сплошная арифметика
def calc_force(self, a, b):
       a_x, a_y, a_m = a
       b_x, b_y, b_m = b
       dx, dy = b_x - a_x, b_y - a_y

       r = (dx ** 2 + dy ** 2) ** 0.5
       F = self.G * a_m * b_m / r ** 2

       fx_1 = F * dx / r if dx != 0 else 0
       fy_1 = F * dy / r if dy != 0 else 0

       return fx_1, fy_1
источник

AK

Alex K in Python для анализа данных
Народ, привет, есть два массива. Какой показатель показывает близость этих массивов при поэлементность вычитании. Это же не среднеквадратичное и не диспресрия вроде как
источник

OO

Oleg Omelchenko in Python для анализа данных
Alex K
Народ, привет, есть два массива. Какой показатель показывает близость этих массивов при поэлементность вычитании. Это же не среднеквадратичное и не диспресрия вроде как
близость в каком смысле? можно простой пример?
источник

AK

Alex K in Python для анализа данных
вычитаем поэлементно и надо сумму поэлементной разности
источник

PZ

Pavel Zheltouhov in Python для анализа данных
Alex K
Народ, привет, есть два массива. Какой показатель показывает близость этих массивов при поэлементность вычитании. Это же не среднеквадратичное и не диспресрия вроде как
Это очередной кроссворд?
Ну тогда манхэтенновское расстояние
источник

AK

Alex K in Python для анализа данных
ага, нашёл уже, спасибо
источник

AD

Andrew Dakhnovsky in Python для анализа данных
Alex K
вычитаем поэлементно и надо сумму поэлементной разности
типа такое штоле?
источник

AK

Alex K in Python для анализа данных
Andrew Dakhnovsky
типа такое штоле?
ага
источник

AK

Alex K in Python для анализа данных
mean_absolute_error
источник

AK

Alex K in Python для анализа данных
аже
источник

AK

Alex K in Python для анализа данных
даже
источник

AD

Andrew Dakhnovsky in Python для анализа данных
Alex K
mean_absolute_error
это встроенное уже есть?
т.е. мой виласипет ненужин?!?!?
источник