请原谅我可能是一个简单的问题。
在张量中应用广播减去是否存在一种优雅,笨拙的方式?
e.g。
import numpy as np
u = np.concatenate((np.ones((3, 1)), np.zeros((3,1))), axis=1).reshape(3,1,2)
v = np.concatenate((np.zeros((3, 1)), np.ones((3,1))), axis=1).reshape(3,1,2)
我会得到结果
array([[[1, 0]],
[[1, 0]],
[[1, 0]]])
array([[[0, 1]],
[[0, 1]],
[[0, 1]]])
我想知道是否有一种优雅的方式来播放减号。这意味着如果我得到张量u的形状[L,m,n]和张量v与形状[L,m,n],我希望结果形状[L,L,m,n],其每秒axis是u中相应行与v。
中每个元素之间的负数提前致谢!
答案 0 :(得分:0)
这可能是你想要的:
w = u.reshape(3,1,1,2) - v.reshape(1,3,1,2)
w
确实具有所需的(3, 3, 1, 2)
形状和值:
array([[[[ 1., -1.]],
[[ 1., -1.]],
[[ 1., -1.]]],
[[[ 1., -1.]],
[[ 1., -1.]],
[[ 1., -1.]]],
[[[ 1., -1.]],
[[ 1., -1.]],
[[ 1., -1.]]]])
使用reshape
要求您了解/查找u
和v
的形状。有一种替代方法(看起来有点混乱)语法会在没有明确形状的情况下执行相同的重塑/广播:
w = u[:,None,...] - v[None,...]