添加具有不同尺寸的矩阵

时间:2017-02-13 21:53:11

标签: python numpy matrix tensorflow

在numpy和tensorflow中,如果较小矩阵的形状是较大矩阵的后缀,则可以添加不同维度的矩阵(或张量)。这是一个例子:

x = np.ndarray(shape=(10, 7, 5), dtype = float)
y = np.ndarray(shape=(7, 5), dtype = float)

对于这两个矩阵,操作x+y是以下的快捷方式:

for a in range(10):
    for b in range(7):
        for b in range(5):
            result[a,b,c] = x[a,b,c] + y[b,c]

在我的情况下,我有形状(10,7,5)(10,5)的矩阵,同样我想使用类似的逻辑执行+操作:

for a in range(10):
    for b in range(7):
        for b in range(5):
            result[a,b,c] = x[a,b,c] + y[a,c]
                                         ^

在这种情况下,x+y操作失败,因为numpy和tensorflow都不了解我想要做的事情。有没有办法可以有效地执行这个操作(没有自己编写python循环)?

到目前为止,我已经想过我可以使用这样的einsum引入形状z的临时矩阵(10,7,5)

z = np.einsum('ij,k->ikj', y, np.ones(7))
x + z

但这会创建一个明确的三维矩阵(或张量),如果可能的话,我宁愿避免这种情况。

2 个答案:

答案 0 :(得分:4)

在NumPy中,您可以将y扩展为3D,然后添加 -

x + y[:,None,:]

Haven没有真正处理tensorflow,但是看看它的文档,似乎我们可以使用tf.expand_dims -

x + tf.expand_dims(y, 1)

扩展版本仍然是y的视图,因此不再占用内存,如下所示 -

In [512]: np.may_share_memory(y, y[:,None,:])
Out[512]: True

答案 1 :(得分:1)

正如在接受的答案中正确指出的那样,解决方案是使用可用的构造来扩展维度。

关键是要理解如果矩阵的尺寸不匹配,在添加矩阵的情况下numpy如何进行矩阵广播。规则是两个矩阵必须具有完全相同的维度,但任何一个矩阵中的某些维度都可以替换为1。

E.g。

A      (4d array):  8 x 1 x 6 x 1
B      (3d array):      7 x 1 x 5
Result (4d array):  8 x 7 x 6 x 5

此示例和详细说明可在scipy docs中找到 Embarcadero forum