不重复的脾气暴躁的广播示例

禅宗

我试图找出一种很好的方法来执行以下加法操作,而无需使用np.repeat创建较大的尺寸。如果使用np.repeat和添加是最好的解决方案,请告诉我。

对于这种情况下的广播,我也感到困惑。本质上,我有一个4d矩阵,我想在第一个索引和第二个索引中添加一个2d矩阵,同时在索引0和索引3上执行此操作。

这可以正常工作

a = np.arange(64).reshape((2,4,4,2)).astype(float)
b = np.ones((2,2))
a[:, 0:2, 0:2, : ] += b

这将引发错误。什么是这样做的好方法?

a[:, 0:3, 0:3, :] += np.ones((3,3))

这有效,但不是我想要做的

c = np.arange(144).reshape(3,4,4,3).astype(float)
c[:, 0:3, 0:3, :] += np.ones((3,3))
塞弗特

您可以从一开始就包含一个空轴:

a[:, 0:3, 0:3, :] += np.ones((3,3,1))  # 1 broadcasts against any axis

类似的,您应该使用过:

a[:, 0:2, 0:2, : ] += np.ones((2,2,1))

因为您(可能是无意间)将这些广播到了第三轴和第四轴。我想您想让它广播到第二和第三,对吗?


另外,您始终可以使用np.expand_dims添加尺寸axis=-1

>>> np.expand_dims(np.ones((2, 2)), axis=-1).shape
(2, 2, 1)

或者用切片Nonenp.newaxis(它们是等效的!):

>>> np.ones((2, 2))[None, :, :, np.newaxis].shape
(1, 2, 2, 1)

None对于正确的广播,第一个不是必需的,但最后一个是!


在这种情况下,重要的是要提到从最后一个维度开始的numpy广播。因此,如果您有两个数组,则从最后一个数组开始的每个维度必须具有相同的形状,或者其中之一必须为1(如果一个数组为1,则它将沿该轴广播!)。这就是为什么a[:, 0:2, 0:2, : ]工作:

>>> a[:, 0:2, 0:2, : ].shape
(2, 2, 2, 2)
>>> b.shape
(2, 2)

因此,最后一个维度相等(均为2),倒数第二个维度相等(均为2)。但是有:

>>> np.ones((2,2,1)).shape
(2, 2, 1)

最后一个是21因此np.ones((2,2,1))当的第二个和第三个维度相等时(全部2),广播的最后一个轴,因此numpy在其中使用逐元素运算。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章