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, :, :]
这将最大限度地减少中间数组的使用。
我无法找出从 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, :, :]
这将最大限度地减少中间数组的使用。