в векторизации. Итак, я бы сказал, просто пройти через.

аюсь добиться того же поведения, что и np.matmul, умножение параллельных матриц, используя просто tenordot, dot, reshaping и т. Д.

Библиотека, которую я перевожу в эту библиотеку, не имеет matmul, который поддерживает параллельное умножение, только точка и тензордот.

Кроме того, я хочу избежать итерации по первому измерению, и хочу сделать это, используя набор умножений и преобразований матриц (хочу, чтобы как можно больше из них работало с использованием BLAS / GPU, так как у меня есть большое количество маленьких матриц для параллельного вычисления).

Вот пример:

import numpy as np

angles = np.array([np.pi/4, 2*np.pi/4, 2*np.pi/4])

vectors = np.array([ [1,0],[1,-1],[-1,0]])

s = np.sin(angles)
c = np.cos(angles)

rotations = np.array([[c,s],[-s,c]]).T

print rotations

print vectors

print("Correct: %s" % np.matmul(rotations, vectors.reshape(3,2,1)))

# I want to do this using tensordot/reshaping, i.e just gemm BLAS operations underneath
print("Wrong: %s" % np.tensordot(rotations, vectors, axes=(1,1)))

Выход этого:

Correct: [[[  7.07106781e-01]
  [  7.07106781e-01]]

 [[  1.00000000e+00]
  [  1.00000000e+00]]

 [[ -6.12323400e-17]
  [ -1.00000000e+00]]]


Wrong: [[[  7.07106781e-01   1.11022302e-16  -7.07106781e-01]
  [ -7.07106781e-01  -1.41421356e+00   7.07106781e-01]]

 [[  6.12323400e-17  -1.00000000e+00  -6.12323400e-17]
  [ -1.00000000e+00  -1.00000000e+00   1.00000000e+00]]

 [[  6.12323400e-17  -1.00000000e+00  -6.12323400e-17]
  [ -1.00000000e+00  -1.00000000e+00   1.00000000e+00]]]

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

Я верю, что это возможно, и виделинекоторые комментарии онлайн, но никогда никаких примеров

 Chris Bamford18 сент. 2017 г., 23:23
да, я заметил, что брать диагональ, но думаю, что это будет гораздо менее эффективным, чем просто цикл
 hpaulj18 сент. 2017 г., 22:16
tensordot перестановки и изменения, так что проблема сводится кdot (а потом обратно). Несколькоmatmul Операции могут быть выполнены путем взятия диагонали из гораздо большего «внешнего» расчета.

Ответы на вопрос(1)

ак,tensordot/dot не будет работать здесь.More info on tensordot может объяснить это как-то, почему это не так. Но мы можем использоватьnp.einsum, который в большинстве случаев (по моему опыту) выглядит немного быстрее, чемnp.matmul.

Реализация будет выглядеть примерно так -

np.einsum('ijk,ik->ij',rotations, vectors)

Кроме того, кажется, что желаемый вывод имеет один трейлинг синглтона. Итак, добавьте новую ось там сNone/np.newaxis, вот так -

np.einsum('ijk,ik->ij',rotations, vectors)[...,None]
 Divakar18 сент. 2017 г., 21:13
@ChrisBamford Что это за библиотека? Это тензорный поток?
 Divakar18 сент. 2017 г., 21:19
@ChrisBamford Нет, это невозможно сdot/tensordot в векторизации. Итак, я бы сказал, просто пройти через.
 Chris Bamford18 сент. 2017 г., 21:10
«В библиотеке, которую я перевожу, я не использую matmul, который поддерживает параллельное умножение, только точка и тензордот». Я тоже не могу использовать einsum. Есть другие идеи?

Ваш ответ на вопрос