Как следующая функция может быть эффективно реализована в тензорном потоке и / или numpy?
add_along_axis(tensor=T, vector=v, axis=k)
# T is a tensor of shape (N1,...,Nd) (unknown beforehand)
# v is a vector with N components
# k is an integer such that Nk=N
S = T+v, summed along k
return S
То есть S
это тензор (N1,..,Nd)
с компонентами S[i1,...,id]=T[i1,...,id] + v[ik]
Обратите внимание, что потенциально любое число Nj
, j≠k
может совпадать с N
, поэтому стандартное вещание не поддерживается.
Пример :Пусть T = np.zeros( (3,3,3) )
и v = [1,2,3]
, тогда правильный вывод должен быть
f(T,v,1) = [[[1., 1., 1.], [[2., 2., 2.], [[3., 3., 3.],
[1., 1., 1.], [2., 2., 2.], [3., 3., 3.],
[1., 1., 1.]], [2., 2., 2.]], [3., 3., 3.]]]
f(T,v,2) = [[[1., 1., 1.], [[1., 1., 1.], [[1., 1., 1.],
[2., 2., 2.], [2., 2., 2.], [2., 2., 2.],
[3., 3., 3.]], [3., 3., 3.]], [3., 3., 3.]]]
f(T,v,3) = [[[1., 2., 3.], [[1., 2., 3.], [[1., 2., 3.],
[1., 2., 3.], [1., 2., 3.], [1., 2., 3.],
[1., 2., 3.]], [1., 2., 3.]], [1., 2., 3.]]]
Здесь, целевое поведение может быть достигнуто записью T+v[:,None,None]
, T+v[None,:,None]
и T+v[None,None,:]
соответственно.Однако я не вижу, как этот подход мог бы работать в случае, когда форма тензора не предопределена.