Подтвердить что ты не робот

Эффективно поверните множество точек с матрицей вращения в numpy

У меня есть список трехмерных точек, хранящихся в массиве numpy A с формой (N,3) и матрицей вращения R с формой (3,3). Я хотел бы вычислить точечный продукт R.x для каждой точки x в A на месте. Наивно я могу это сделать:

for n in xrange(N):
    A[n,:] = dot(R, A[n,:]) 

Есть ли способ векторизовать это с помощью собственного вызова numpy? Если это имеет значение, N - порядка нескольких тысяч.

4b9b3361

Ответ 1

Вы можете умножить A на транспонирование матрицы вращения:

A = dot(A, R.T)

Ответ 2

Есть пара небольших обновлений/уточняющих моментов, чтобы добавить к Аапо Криоле (правильный) ответ. Во-первых, синтаксис умножения матриц можно немного упростить с помощью недавно добавленного оператора умножения матриц @:

A = A @ R.T

Также вы можете упорядочить преобразование в стандартной форме (сначала матрицу вращения), взяв транспонирование A перед умножением, а затем транспонировав результат:

A = (R @ A.T).T

Вы можете проверить, что обе формы преобразования дают одинаковые результаты с помощью следующего утверждения:

np.testing.assert_array_equal((R @ A.T).T, A @ R.T)