O
Помогите пожалуйста разобраться, как я могу применить векторизацию. В рамках саморазвлечения и самообразования пытаюсь с нуля написать на питоне вычислительное решение 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, и я не вполне могу быстро разобраться какой из них мне может подойти а какой нет. Заранее спасибо!