numpy中的张量扩展

时间:2018-06-25 10:27:52

标签: numpy tensor expansion

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

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

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

d x (d+1)

该解决方案远非理想,因为我必须保留原始数组的副本,遍历所有行,获取#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很大,并且多个进程并行执行,因此理想情况下,此张量扩展应尽可能高效。任何建议表示赞赏!

2 个答案:

答案 0 :(得分:1)

我相信以下代码可以无循环地满足您的要求。想法是将张量扩展到所需的维度,然后在一行中与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) 

答案 1 :(得分:0)

您的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,但我没有遵循这些细节。