np.tensordot для вращения облаков точек? - PullRequest
0 голосов
/ 30 января 2019

Вращение вокруг источника - это матричный продукт, который можно выполнить с помощью функции numpy's dot,

import numpy as np
points = np.random.rand(100,3)  # 100 X, Y, Z tuples.  shape = (100,3)
rotation = np.identity(3)  # null rotation for example
out = np.empty(points.shape)
for idx, point in enumerate(points):
    out[idx,:] = np.dot(rotation, point)

Это включает цикл for, или для векторизации можно использовать плитку numpy.Я думаю, что есть реализация с участием np.tensordot, но эта функция для меня колдовство.Возможно ли это?

1 Ответ

0 голосов
/ 31 января 2019

Есть несколько способов сделать это.С np.matmul вы можете сделать:

out = np.matmul(rotation, points[:, :, np.newaxis])[:, :, 0]

Или, что эквивалентно, если вы используете Python 3.5 или более позднюю версию:

out = (rotation @ points[:, :, np.newaxis])[:, :, 0]

Другой способ - с np.einsum:

out = np.einsum('ij,nj->ni', rotation, points)

Наконец, как вы предложили, вы также можете использовать np.tensordot:

out = np.tensordot(points, rotation, axes=[1, 1])

Обратите внимание, что вв этом случае points является первым аргументом, а rotation - вторым, в противном случае размеры на выходе будут изменены на противоположные.

...