【问题标题】:Any suggestions for multiplying a tensor (along an arbitrary axis) with a matrix in python?在 python 中将张量(沿任意轴)与矩阵相乘有什么建议吗?
【发布时间】:2021-06-13 00:35:09
【问题描述】:

我有一个秩为 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)

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

谁能提出更好/更通用/替代的方法来做到这一点?我真的很感激任何帮助。提前致谢。

【问题讨论】:

    标签: python numpy tensorflow matrix-multiplication tensor


    【解决方案1】:

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

    我尝试了不同的方法,最终想出了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())
    

    【讨论】:

    • 非常感谢您的回答!几乎没有什么变化,它正是我想要的。 i = 1j = -2v = np.tensordot(M,T,axes=[[i],[j-1]])v = np.rollaxis(v,0,j)
    【解决方案2】:

    矩阵类似于(不等于)秩为 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 是用于多线性代数和张量的 Python 模块 分解。目前,scikit-tensor 支持基本张量 折叠/展开、tensor-matrix 和 tensor-vector 等操作 产品以及以下张量分解

    Canonical / Parafac Decomposition
    Tucker Decomposition
    RESCAL
    DEDICOM
    INDSCAL
    

    此外,所有操作都支持密集和张量。

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

    张量收缩:

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

    【讨论】:

    • 请原谅我措辞不准确。这只是一个计算问题;就我而言,它与我想要存储和操作的部分数据的形状有关。
    猜你喜欢
    • 2011-05-28
    • 2018-02-24
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    相关资源
    最近更新 更多