python - Numpy:从子矩阵广播

标签 python numpy matrix

给定两个二维数组:

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/

相关文章:

python - 您如何有效地将一个数组中某个值在另一个数组中的位置出现的次数相加

arrays - 打乱一个方形 numpy 数组,但保留行索引和列索引之间的对应关系

python - 使用 Networkx (Python) 进行图形遍历

python - 如何在 QScintilla 小部件内的特定位置显示对话框?

Python 读取麦克风而不使用 PyAudio

python - 哪个数字代表 shape 返回的元组中的行和列?

c - 从二维数组中获取用户输入

python - PVLib 预测未根据时区进行调整

python - Django 获取一个月中每一天的对象数

python - 如何在 numpy 中堆叠数组和标量?