【问题标题】:Adding matrix rows to columns in numpy将矩阵行添加到numpy中的列
【发布时间】:2018-02-23 02:07:28
【问题描述】:

假设我有两个具有维度的 3D 矩阵/张量:

[10, 3, 1000]
[10, 4, 1000]

如何将每个向量的第三个维度的每个组合相加,以获得如下维度:

[10, 3, 4, 1000]

因此,如果您愿意,每行在每个向量的第二个 x 三维中都会在每个组合中添加到另一个向量。抱歉,如果不清楚,我很难表达这一点......

是否有某种聪明的方法可以用 numpy 或 pytorch 来做到这一点(对 numpy 解决方案非常满意,尽管我试图在 pytorch 上下文中使用它,所以火炬张量操作会更好)不让我写一堆嵌套的 for 循环吗?

嵌套循环示例:

x = np.random.randint(50, size=(32, 16, 512))
y = np.random.randint(50, size=(32, 21, 512))
scores = np.zeros(shape=(x.shape[0], x.shape[1], y.shape[1], 512))

for b in range(x.shape[0]):
    for i in range(x.shape[1]):
        for j in range(y.shape[1]):

            scores[b, i, j, :] = y[b, j, :] + x[b, i, :]

【问题讨论】:

  • 你的意思是arr1[:, :, None, :] + arr2[:, None, :, :]
  • 是的……可能。我在尝试使用嵌套循环的地方发布了一些示例代码,然后我尝试了您的示例,但不知何故,即使尺寸相同,这些值也不相等。我可能在我的循环中犯了一个错误,但我只是想确保你的代码正在做我理解的事情。不知道发生了什么...
  • 不是手电筒用户,所以恐怕无法帮助您。 .data[0] 是做什么的?
  • 哦,它只是返回张量中底层 numpy 矩阵的值......它不相关;我也可以用 numpy 形式编写它,但那里的代码看起来像它所做的那样,你可以忽略 .data[0]。 size(x) 函数还给出了维度 x 的矩阵大小
  • 实际上你可能是对的......我在 numpy 中实现了它,它是平等的......谢谢。我在某处搞砸了我的火炬实现

标签: python numpy pytorch


【解决方案1】:

它对你有用吗?

import torch

x1 = torch.rand(5, 3, 6)
y1 = torch.rand(5, 4, 6)

dim1, dim2 = x1.size()[0:2], y1.size()[-2:]
x2 = x1.unsqueeze(2).expand(*dim1, *dim2)
y2 = y1.unsqueeze(1).expand(*dim1, *dim2)

result = x2 + y2

print(x1[0, 1, :])
print(y1[0, 2, :])
print(result[0, 1, 2, :])

输出

 0.2884
 0.5253
 0.1463
 0.4632
 0.8944
 0.6218
[torch.FloatTensor of size 6]


 0.5654
 0.0536
 0.9355
 0.1405
 0.9233
 0.1738
[torch.FloatTensor of size 6]


 0.8538
 0.5789
 1.0818
 0.6037
 1.8177
 0.7955
[torch.FloatTensor of size 6]

【讨论】:

  • 感谢您的回复。我的代码有错误;否则,保罗的回答确实给了我与我的循环相同的结果,只有一条线,在火炬和 numpy 中。如果您认为我忽略了那条线,请告诉我...
猜你喜欢
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多