使用 einsum 的张量元素外积
elementwise outer product of tensors using einsum
我有以下两个数组:
foo = np.array([1,2,3,4,5,6,7,8,9])
和
bar = np.array([k1, k2, k3])
哪里
k1 = np.array([[1],[2]])
k2 = np.array([[4],[6]])
k3 = np.array([[9],[3]])
我想找到 foo
和 bar
中每三分之一的 elementwise outer product
。换句话说 foo 需要重新排列
在被送入np.outer
之前如下:
[array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9])]
这是我所做的。
def elmntwise_outer_prod(arr1, arr2):
arr1 = np.split(arr1, 3)
out = [np.outer(val1, val2) for val1, val2 in zip(arr1, arr2)]
return np.array(out)
现在,当我执行 elmntwise_outer_prod(foo, bar)
时,它会给我所需的输出
array([[[ 1, 2],
[ 2, 4],
[ 3, 6]],
[[16, 24],
[20, 30],
[24, 36]],
[[63, 21],
[72, 24],
[81, 27]]])
问题请问有更好的方法吗?。特别是,我如何使用 np.einsum
更有效地编写此代码(如果有的话)。我已经阅读了以前解决类似问题的问题,但我似乎无法理解这个问题。我还阅读了 this 博客 post RE np.einsum
.
有什么帮助吗?
没有涉及和减少,所以我们可以简单地使用 broadcasting
-
(foo.reshape(-1,3)[:,None,:]*bar).swapaxes(1,2)
# or foo.reshape(-1,3)[...,None]*bar[:,None,:,0]
如果你必须使用np.einsum
-
np.einsum('ij,ikl->ijk',foo.reshape(-1,3), bar)
我有以下两个数组:
foo = np.array([1,2,3,4,5,6,7,8,9])
和
bar = np.array([k1, k2, k3])
哪里
k1 = np.array([[1],[2]])
k2 = np.array([[4],[6]])
k3 = np.array([[9],[3]])
我想找到 foo
和 bar
中每三分之一的 elementwise outer product
。换句话说 foo 需要重新排列
在被送入np.outer
之前如下:
[array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9])]
这是我所做的。
def elmntwise_outer_prod(arr1, arr2):
arr1 = np.split(arr1, 3)
out = [np.outer(val1, val2) for val1, val2 in zip(arr1, arr2)]
return np.array(out)
现在,当我执行 elmntwise_outer_prod(foo, bar)
时,它会给我所需的输出
array([[[ 1, 2],
[ 2, 4],
[ 3, 6]],
[[16, 24],
[20, 30],
[24, 36]],
[[63, 21],
[72, 24],
[81, 27]]])
问题请问有更好的方法吗?。特别是,我如何使用 np.einsum
更有效地编写此代码(如果有的话)。我已经阅读了以前解决类似问题的问题,但我似乎无法理解这个问题。我还阅读了 this 博客 post RE np.einsum
.
有什么帮助吗?
没有涉及和减少,所以我们可以简单地使用 broadcasting
-
(foo.reshape(-1,3)[:,None,:]*bar).swapaxes(1,2)
# or foo.reshape(-1,3)[...,None]*bar[:,None,:,0]
如果你必须使用np.einsum
-
np.einsum('ij,ikl->ijk',foo.reshape(-1,3), bar)