在 python 中将张量(沿任意轴)与矩阵相乘有什么建议吗?

Any suggestions for multiplying a tensor (along an arbitrary axis) with a matrix in python?

我有一个阶数为 N 且键维为 d 且形状为 T=(d,...,d) 的张量。 我想乘以矩阵 M=(D,d),其中 D 与 d 不同。 所得张量的形状应为 (d,...,d,D,d,...,d).

虽然我可以这样做以获得例如 (d,...,d,D,d,d) 张量:

np.einsum('ij, ...jkl->...ikl', M,T)

张量的秩可能很大,我需要多次这样做。因此,我想避免像上面那样写出每个特定案例,因为这不切实际。

有人可以建议 better/more general/alternative 方法吗?我真的很感激任何帮助。提前致谢。

有趣的问题。 你想要的是在特定维度上乘以两个张量并获得具有特定形状的新张量。

我尝试了不同的方法,最终想出了 numpy.tensordotnumpy.rollaxis 的组合。

前者允许指定轴之间的张量积。后者旋转张量以获得预期的形状。

这是一个有趣的问题,谢谢。我希望我做对了,让我知道。

import numpy as np
d=4
N=5
D=7
T = np.random.randint(0,9, (d,)*N)
M = np.random.randint(0,9, (D,d))

r = np.einsum('ij, ...jkl->...ikl', M,T)

i = 1
j = -3 

v = np.tensordot(M,T,axes=[[i],[j]])
v = np.rollaxis(v,0,j)

assert((v==r).all())

矩阵类似于(不等于)2 阶张量 https://physics.stackexchange.com/questions/20437/are-matrices-and-second-rank-tensors-the-same-thing , Multiply Tensors with different ranks )

scikit-tensor 中是张量矩阵运算 ( https://pypi.org/project/scikit-tensor/ )

scikit-tensor is a Python module for multilinear algebra and tensor factorizations. Currently, scikit-tensor supports basic tensor operations such as folding/unfolding, tensor-matrix and tensor-vector products as well as the following tensor factorizations

Canonical / Parafac Decomposition
Tucker Decomposition
RESCAL
DEDICOM
INDSCAL

Moreover, all operations support dense and tensors.

来源:https://github.com/mnick/scikit-tensor

张量收缩:

https://physics.stackexchange.com/questions/252473/converting-between-matrix-multiplication-and-tensor-contraction