numpy(n,m)和(n,k)至(n,m,k)

时间:2020-01-24 12:57:13

标签: numpy linear-algebra tensor

xnp.array形状的(n, m)

ynp.array形状的(n, k)

计算形状z的张量(n, m, k)的正确方法是什么

for all i in [0, n - 1]
z[i] = np.dot(x[i][:, np.newaxis], y[i][np.newaxis, :])

换句话说,每一对行(x_i, y_i)给出一个形状为(m, k)的矩阵。

我查看了np.tensordot,但是经过多次试验,我找不到其axes参数的正确值。我不确定这是工作的正确工具。

2 个答案:

答案 0 :(得分:2)

您可以像这样使用np.einsum()

z = np.einsum('ij,ik->ijk', x, y)

通过快速测试,这也比基于np.matmul()的方法要快(除了非常小的输入):

import numpy as np


x = np.random.randint(1, 100, (2, 3))
y = np.random.randint(1, 100, (2, 4))

%timeit np.einsum('ij,ik->ijk', x, y)
# 100000 loops, best of 3: 3.14 µs per loop
%timeit np.matmul(x[:, :, None], y[:, None, :])
# 100000 loops, best of 3: 2,07 µs per loop


x = np.random.randint(1, 100, (20, 30))
y = np.random.randint(1, 100, (20, 40))

%timeit np.einsum('ij,ik->ijk', x, y)
# 10000 loops, best of 3: 32.1 µs per loop
%timeit np.matmul(x[:, :, None], y[:, None, :])
# 10000 loops, best of 3: 76.8 µs per loop


x = np.random.randint(1, 100, (200, 300))
y = np.random.randint(1, 100, (200, 400))

%timeit np.einsum('ij,ik->ijk', x, y)
# 10 loops, best of 3: 48.7 ms per loop
%timeit np.matmul(x[:, :, None], y[:, None, :])
# 10 loops, best of 3: 68.2 ms per loop

np.dot()在可广播视图中的应用如下:

np.dot(x[:, :, None], y[:, None, :])

将无法工作(甚至无法达到正确的形状)。

(已编辑)

答案 1 :(得分:1)

一个简单的np.matmul(x[:, :, None], y[:, None, :])就能解决问题。

摘自numpy.matmul的文档:

如果任一自变量为N-D,N> 2,则将其视为位于最后两个索引中并相应广播的一组矩阵。

这正是我想要做的。

相关问题