python for 循环和 3D numpy 矩阵加法之间的等价性

Equivalence between python for-loop and 3D numpy matrix additions

我无法找出从 for 循环到矢量化 numpy 操作的非常简单的转换中的错误。代码如下

 for null_pos in null_positions:
      np.add(singletree[null_pos, parent.x, :, :],
             posteriors[parent.u, null_pos, :, :],
             out=singletree[null_pos, parent.x, :, :])

由于是2维矩阵之间的简单加法,我归纳为3维加法

 np.add(singletree[null_positions, parent.x, :, :],
             posteriors[parent.u, null_positions, :, :],
             out=singletree[null_positions, parent.x, :, :])

问题是,结果好像不一样!你能看出原因吗?

谢谢!

更新: 好像

singletree[null_positions, parent.x, :, :] = \
             posteriors[parent.u, null_positions, :, :] +
             singletree[null_positions, parent.x, :, :]

问题解决。这与添加操作有何不同? (除了分配一个新矩阵,我对语义方面很感兴趣)

问题是传递 out=singletree[null_positions, parent.x, :, :] 是在复制 singletree 的部分,因为您使用的是 advanced indexing (as opposed to basic indexing,returns 观看)。因此,结果将被写入一个完全不同的数组,而原始数组将保持不变。

然而,you can use advanced indexing to assign values。在你的情况下,最值得推荐的语法是:

singletree[null_positions, parent.x, :, :] += \
    posteriors[parent.u, null_positions, :, :]

这将最大限度地减少中间数组的使用。