Питон — Собственное сокращение против Numpy Dot

Привет всем, у меня есть следующий тензорный продукт в Numpy:

import numpy as np

tensorA = np.array([[[1,2,3],
[4,5,6],
[7,8,9]],
[[10,11,12],
[13,14,15],
[16,17,18]],
[[19,20,21],
[22,23,24],
[25,26,27]]])

tensorB = np.array([[1,2],
[1,2],
[1,2]])

print tensorA.dot(tensorB)

Это дает следующий ответ:

[[[  6  12]
[ 15  30]
[ 24  48]]

[[ 33  66]
[ 42  84]
[ 51 102]]

[[ 60 120]
[ 69 138]
[ 78 156]]]

Тем не менее, когда я делаю то же самое в C ++ Eigen:

Eigen::Tensor<float, 3> tensorA(3,3,3);
tensorA.setValues({{{1,2,3},
{4,5,6},
{7,8,9}},

{{10,11,12},
{13,14,15},
{16,17,18}},

{{19,20,21},
{22,23,24},
{25,26,27}}});

Eigen::Tensor<float, 2> tensorB(3,2);
tensorB.setValues({{1,2},
{1,2},
{1,2}});

// Compute the traditional matrix product
Eigen::array<Eigen::IndexPair<float>, 1> product_dims = { Eigen::IndexPair<float>(0, 1) };
Eigen::Tensor<float, 3> AB = tensorA.contract(tensorB, product_dims);

Я получил:

D: 3 R: 3 C: 2
[[12.000     24.000     ]
[15.000     30.000     ]
[18.000     36.000     ]
]
R: 3 C: 2
[[39.000     78.000     ]
[42.000     84.000     ]
[45.000     90.000     ]
]
R: 3 C: 2
[[66.000     132.000     ]
[69.000     138.000     ]
[72.000     144.000     ]
]

Почему это происходит. Я хочу получить тензорное произведение, которое эквивалентно тому, что дает мне numpy. Это как-то связано с параметром product_dims в c ++? Или есть какая-то другая ошибка? По сути, он должен умножить компонент глубины в 3 раза.

0

Решение

Я не могу помочь вам с кодом C ++, но я могу определить, в тупик, что происходит:

In [1]: A=np.arange(1,28).reshape(3,3,3)
In [3]: A
Out[3]:
array([[[ 1,  2,  3],
[ 4,  5,  6],
[ 7,  8,  9]],

[[10, 11, 12],
[13, 14, 15],
[16, 17, 18]],

[[19, 20, 21],
[22, 23, 24],
[25, 26, 27]]])
In [5]: B=np.repeat([[1,2]],3, axis=0)
In [6]: B
Out[6]:
array([[1, 2],
[1, 2],
[1, 2]])

Ваша точка — помните последний из A со 2-го до последнего из B:

In [7]: A.dot(B)
Out[7]:
array([[[  6,  12],
[ 15,  30],
[ 24,  48]],

[[ 33,  66],
[ 42,  84],
[ 51, 102]],

[[ 60, 120],
[ 69, 138],
[ 78, 156]]])

С einsum Индекс это понятно (по крайней мере для меня):

In [8]: np.einsum('ijk,kl',A,B)    # notice the k pair
Out[8]:
array([[[  6,  12],
[ 15,  30],
[ 24,  48]],

[[ 33,  66],
[ 42,  84],
[ 51, 102]],

[[ 60, 120],
[ 69, 138],
[ 78, 156]]])

Но если я изменю einsum чтобы использовать 2-е до последнего из обоих, я получаю ваши результаты C ++ (я думаю):

In [9]: np.einsum('ijk,jl',A,B)    # notice the j pair
Out[9]:
array([[[ 12,  24],
[ 15,  30],
[ 18,  36]],

[[ 39,  78],
[ 42,  84],
[ 45,  90]],

[[ 66, 132],
[ 69, 138],
[ 72, 144]]])
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]