【问题标题】:Tensor expansion in numpynumpy中的张量扩展
【发布时间】:2018-06-25 10:27:51
【问题描述】:

我正在尝试找到一种优雅的方法来解决以下问题。

我有一个张量y 包含n dxd 矩阵,我通过选择矩阵X 的行组合获得它。我有第二个 numpy 数组,大小为k x d。我的意图是扩展张量,以便将k x d 矩阵的每一行添加到 y 张量中的每个元素,以获得带有k x nd x (d+1) 矩阵的y' 张量。

如果没有 for 循环,我看不到怎么做。我的简单代码示例如下:

#Array x
X = np.arange(27).reshape(9,3)
# Create tensor y
combs = [(0,1,2),(0,1,3),(0,1,4),(0,1,5)]
y = X[combs,:]
# Add a dummy column of 1.0s to each element of the y tensor
b = np.array([1.0,1.0,1.0]).reshape(1,3)
b = b.repeat(y.shape[0],axis=0).reshape(y.shape[0],y.shape[1],1)
# Concatenate the column with the tensor
y_new = np.concatenate((y,b),axis=2)`

这个解决方案远非理想,因为我必须保留原始数组的副本,遍历所有行,获取 k 张量,然后在最后合并它们。在我试图解决的一般问题中,张量 y 很大,并且多个进程并行执行,因此这种张量扩展在理想情况下应该尽可能高效。任何建议表示赞赏!

【问题讨论】:

    标签: numpy tensor expansion


    【解决方案1】:

    您的repeatconcatenate 代码可以简化,并且可能加快:

    In [50]: z = np.zeros((y.shape[:-1]+(y.shape[-1]+1,)))
    In [51]: z.shape
    Out[51]: (4, 3, 4)
    In [52]: z[:,:,:-1]=y
    In [53]: z[:,:,-1]=np.array([.1,.2,.3])
    

    即创建目标数组,并填充来自yb 的值。使用广播b 不需要重塑和重复。

    听起来好像您将这个y_new 嵌入到某种循环中,但我没有遵循这些细节。

    【讨论】:

      【解决方案2】:

      我相信以下代码可以满足您的要求,无需循环。这个想法是将张量扩展到所需的维度,然后在一行中执行与 numpy 的连接:

      X = np.arange(27).reshape(9,3)
      # Create tensor y
      combs = [(0,1,2),(0,1,3),(0,1,4),(0,1,5)]
      y = X[combs,:]
      # Create tensor b, (the k x d matrix in your question)
      b = np.arange(100,121).reshape(7,3,1)
      # expand the tensors 
      b = np.stack([b]*4,axis=1)
      y = np.stack([y]*7)
      # concatenate
      y_new = np.concatenate([y,b],axis=3) 
      

      【讨论】:

        猜你喜欢
        • 2014-09-06
        • 2022-11-26
        • 1970-01-01
        • 2019-07-08
        • 2021-07-26
        • 1970-01-01
        • 2019-02-23
        • 1970-01-01
        • 2022-07-08
        相关资源
        最近更新 更多