в векторизации. Итак, я бы сказал, просто пройти через.
аюсь добиться того же поведения, что и 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]]]
Есть ли способ, которым я могу изменить второе выражение, чтобы получить тот же результат, что и первое, просто с помощью точки / тензордот.
Я верю, что это возможно, и виделинекоторые комментарии онлайн, но никогда никаких примеров