2014-10-10 1 views
5

У меня есть массив, который содержит кучу точек (3D векторов, в частности):Использовать numpy для умножения матрицы на массив точек?

pts = np.array([ 
    [1, 1, 1], 
    [2, 2, 2], 
    [3, 3, 3], 
    [4, 4, 4], 
    [5, 5, 5], 
]) 

И я хотел бы умножить каждую из этих точек с помощью матрицы преобразования:

pts[0] = np.dot(transform_matrix, pts[0]) 
pts[1] = np.dot(transform_matrix, pts[1]) 
… 
pts[n] = np.dot(transform_matrix, pts[n]) 

Как я могу сделать это эффективно?

ответ

9

Я нахожу, что это помогает сначала написать версию einsum - после того, как вы увидите индексы, вы часто можете узнать, что есть более простая версия. Например, начиная с

>>> pts = np.random.random((5,3)) 
>>> transform_matrix = np.random.random((3,3)) 
>>> 
>>> pts_brute = pts.copy() 
>>> for i in range(len(pts_brute)): 
...   pts_brute[i] = transform_matrix.dot(pts_brute[i]) 
...  
>>> pts_einsum = np.einsum("ij,kj->ik", pts, transform_matrix) 
>>> np.allclose(pts_brute, pts_einsum) 
True 

вы можете увидеть, что это просто

>>> pts_dot = pts.dot(transform_matrix.T) 
>>> np.allclose(pts_brute, pts_dot) 
True 
+0

Awesome, спасибо! Кроме того, это отличный совет о 'einsum' - спасибо. –

3

умножение матрицы на матрицу можно рассматривать как «пакетный режим» матрично-векторное умножение, где каждый столбец в секунде матрица - один из векторов, умножаемых на первый, причем векторы результата являются столбцами результирующей матрицы.

Также отметим, что так как (АВ) Т = В ТТ, и, следовательно, (перестановкой обе стороны) ((АВ) Т) Т = АВ = (В ТТ) Т можно сделать аналогичное утверждение о строках первой матрицы, являющихся batch- (лево-), умноженной на транспонирование второй матрицы, в результате векторы являясь строки из матрица продукт.

Смежные вопросы