我正在尝试找到一种解决以下问题的优雅方法。
我有一个包含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
很大,并且多个进程并行执行,因此理想情况下,此张量扩展应尽可能高效。任何建议表示赞赏!
答案 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)
您的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_new
,但我没有遵循这些细节。