给定两个二维数组:
A =[[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]]
B =[[1, 2],
[3, 4]]
A - B = [[ 0, -1, 1, 0],
[-2, -3, -1, -2],
[ 2, 1, 3, 2],
[ 0, -1, 1, 0]]
B 的形状为 2,2,A 的形状为 4,4。我想在 A 上执行 B 的广播减法:A - B。
我特别想使用广播,因为我正在处理的数组大小非常大(8456,8456)。我希望广播能够提供小的性能优化。
我尝试过 reshape 数组,但没有成功,并且被难住了。我无法使用 Scikit。
最佳答案
您可以通过在两个维度上平铺两次来扩展 B
:
print A - numpy.tile(B, (2, 2))
产量
[[ 0 -1 1 0]
[-2 -3 -1 -2]
[ 2 1 3 2]
[ 0 -1 1 0]]
但是对于大矩阵,这可能会在 RAM 中产生大量开销。
或者您可以view A
in blocks使用 Scikit Image 的 skimage.util.view_as_blocks
并就地修改它
Atmp = skimage.util.view_as_blocks(A, block_shape=(2, 2))
Atmp -= B
print A
这将导致,而无需不必要地重复B
[[ 0 -1 1 0]
[-2 -3 -1 -2]
[ 2 1 3 2]
[ 0 -1 1 0]]
关于python - Numpy:从子矩阵广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40591683/