numpy中的张量展开

numpy中的张量展开,numpy,tensor,expansion,Numpy,Tensor,Expansion,我试图找到一个优雅的方法来解决以下问题 我有一个包含ndxd矩阵的张量y,我通过选择矩阵X的行组合获得。我还有第二个numpy数组,大小kxd。我的意图是扩展张量,以便将kxd矩阵的每一行添加到y张量中的每一个元素,以获得具有kxndx(d+1)矩阵的y'张量 如果没有for循环,我看不出该如何做。我的简单代码示例如下所示: #Array x X = np.arange(27).reshape(9,3) # Create tensor y combs = [(0,1,2),(0,1,3),(0,

我试图找到一个优雅的方法来解决以下问题

我有一个包含
n
dxd
矩阵的张量
y
,我通过选择矩阵
X
的行组合获得。我还有第二个numpy数组,大小
kxd
。我的意图是扩展张量,以便将
kxd
矩阵的每一行添加到y张量中的每一个元素,以获得具有
kxn
dx(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
很大,多个进程并行执行,因此理想情况下,张量展开应该尽可能有效。任何建议,谢谢

您的
repeat
concatenate
代码可以简化,并可能通过以下方式加快速度:

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])
即创建目标数组,并用
y
b
中的值填充。使用广播
b
不需要重新整形和重复


听起来好像你在某种循环中嵌入了这个
y\u new
,但我没有遵循这些细节。

你的
重复
串联
代码可以简化,可能还可以通过以下方式加快速度:

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])
即创建目标数组,并用
y
b
中的值填充。使用广播
b
不需要重新整形和重复


听起来好像您正在将此
y\u new
嵌入某种循环中,但我没有遵循这些细节。

我相信下面的代码在没有循环的情况下可以满足您的要求。其思想是将张量扩展到所需的维度,然后在一行中使用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) 

我相信下面的代码不需要循环就能满足您的要求。其思想是将张量扩展到所需的维度,然后在一行中使用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)