我试图找出一种很好的方法来执行以下加法操作,而无需使用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)
或者用切片None
或np.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)
最后一个是2
,1
因此np.ones((2,2,1))
当的第二个和第三个维度相等时(全部2
),广播的最后一个轴,因此numpy在其中使用逐元素运算。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句