为了账号安全,请及时绑定邮箱和手机立即绑定

沿特定轴添加/乘以张量和向量

沿特定轴添加/乘以张量和向量

慕容森 2021-09-14 21:37:03
如何在 tensorflow 和/或 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,:]。但是,我不知道这种方法在张量形状未预定义的情况下如何工作。
查看完整描述

2 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

您可以通过执行列表理解v[:,None,None]为 T 的任何维度和任何轴自动生成 ,k例如:


def f(T,v,k):

    return T+v[[np.newaxis if i+1 != k else slice(None) for i in range(T.ndim) ]]

np.newaxis等价于None,slice(None)等价于:。结果如预期:


print (f(T,v,2))

array([[[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.]]])


查看完整回答
反对 回复 2021-09-14
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

只需将 T.ndim-k 单位长度维度附加到 v 和 numpy 的广播规则按设计工作:


def f(T, v, k):

    v = asarray(v)

    return T + v.reshape(v.shape + (1,)*(T.ndim-k))

请注意,您对 k 的定义比标准 numpy 轴编号大 1;您可能会考虑将 k 减少 1 并将其称为“轴”。


查看完整回答
反对 回复 2021-09-14
  • 2 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信