Python 沿任意轴的numpy广播加法
我想通过简单地沿一个或多个轴执行相同的加法来添加两个具有不同维度的数组 非矢量化解决方案:Python 沿任意轴的numpy广播加法,python,numpy,Python,Numpy,我想通过简单地沿一个或多个轴执行相同的加法来添加两个具有不同维度的数组 非矢量化解决方案: x = np.array([[[1,2],[3,4],[5,6]],[[7,8],[9,0],[1,2]],[[3,4],[5,6],[7,8]],[[9,0],[1,2],[3,4]]]) #shape (4,3,2) y = np.array([[1,2],[3,4],[5,6],[7,8]]) #shape (4,2) ans = np.copy(x) for i in range(x.shape
x = np.array([[[1,2],[3,4],[5,6]],[[7,8],[9,0],[1,2]],[[3,4],[5,6],[7,8]],[[9,0],[1,2],[3,4]]]) #shape (4,3,2)
y = np.array([[1,2],[3,4],[5,6],[7,8]]) #shape (4,2)
ans = np.copy(x)
for i in range(x.shape[1]):
ans[:,i] += y
print(ans) #shape (4,3,2)
如何沿例如第二个轴广播此信息?更一般地说,如何沿任意轴进行广播?查看两个阵列的形状:
>>> x.shape
(4, 3, 2)
>>> y.shape
(4, 2)
您可以看到,添加内容需要在此处沿第0轴和最后一轴进行广播。一个简单的选择是
>>> x + y[:, None, :]
array([[[ 2, 4],
[ 4, 6],
[ 6, 8]],
[[10, 12],
[12, 4],
[ 4, 6]],
[[ 8, 10],
[10, 12],
[12, 14]],
[[16, 8],
[ 8, 10],
[10, 12]]])
在哪里,
>>> y[:, None, :].shape
(4, 1, 2)
这实际上只是改变了y的步幅,因此可以播放加法
更好的方法是,按照hpaulj在评论中的建议,使用np.expand_dims,这将添加一个额外的倒数第二维度,因此您可以这样做
>>> x + np.expand_dims(y, 1)
array([[[ 2, 4],
[ 4, 6],
[ 6, 8]],
[[10, 12],
[12, 4],
[ 4, 6]],
[[ 8, 10],
[10, 12],
[12, 14]],
[[16, 8],
[ 8, 10],
[10, 12]]])
请看两个阵列的形状:
>>> x.shape
(4, 3, 2)
>>> y.shape
(4, 2)
您可以看到,添加内容需要在此处沿第0轴和最后一轴进行广播。一个简单的选择是
>>> x + y[:, None, :]
array([[[ 2, 4],
[ 4, 6],
[ 6, 8]],
[[10, 12],
[12, 4],
[ 4, 6]],
[[ 8, 10],
[10, 12],
[12, 14]],
[[16, 8],
[ 8, 10],
[10, 12]]])
在哪里,
>>> y[:, None, :].shape
(4, 1, 2)
这实际上只是改变了y的步幅,因此可以播放加法
更好的方法是,按照hpaulj在评论中的建议,使用np.expand_dims,这将添加一个额外的倒数第二维度,因此您可以这样做
>>> x + np.expand_dims(y, 1)
array([[[ 2, 4],
[ 4, 6],
[ 6, 8]],
[[10, 12],
[12, 4],
[ 4, 6]],
[[ 8, 10],
[10, 12],
[12, 14]],
[[16, 8],
[ 8, 10],
[10, 12]]])
要将y与x一起使用,必须将其重塑为4,1,2。广播规则有很好的文档记录。您可以使用repmat或tile吗?您只想广播一个维度吗?或者其中一个数组可以比另一个数组大1维以上?这显然是:。y是3,2,所以广播需要1,3,2的形状,这是自动的。要将y与x一起使用,必须将其重塑为4,1,2。广播规则有很好的文档记录。您可以使用repmat或tile吗?您只想广播一个维度吗?或者其中一个数组可以比另一个数组大1维以上?这显然是:。y是3,2,所以广播需要1,3,2的形状,这是自动的。我认为这个答案是正确的,OP可以使用多个None,如果需要的话。除非他在寻找一个广义函数,找出相似的维数,然后调整广播;因此,他可能确实在关注“武断”。在任何情况下,通常的做法是根据需要添加None维度。广播规则设计得很好,以避免出现模棱两可的情况。@anishtain4:我认为发现相似的维度有点危险,因为两个维度的大小可能相同,但这本身并不意味着它们在语义上是相同的。因此,这可能导致函数经常工作,但偶尔会出现意外行为。我认为这个答案是正确的,OP可以在需要时使用多个None。除非他在寻找一个广义函数,找出相似的维数,然后调整广播;因此,他可能确实在关注“武断”。在任何情况下,通常的做法是根据需要添加None维度。广播规则设计得很好,以避免出现模棱两可的情况。@anishtain4:我认为发现相似的维度有点危险,因为两个维度的大小可能相同,但这本身并不意味着它们在语义上是相同的。因此,这可能导致函数经常工作,但偶尔会出现意外行为。