如何使用numpy将小矩阵添加到大矩阵中?

10

我正试图弄清楚如何将一个小矩阵(下面的矩阵 B)的值添加到一个大矩阵(下面的矩阵 A)的特定索引处。似乎使用numpy在这种情况下是一个不错的选择,但我不知道该如何做。

矩阵 A

[[0, 0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0, 0]]

矩阵 B

[[2, 3, 4]
 [5, 6, 7]
 [8, 9, 3]]

期望的最终结果:

[[0, 0, 0, 0, 0, 0]
 [0, 0, 2, 3, 4, 0]
 [0, 0, 5, 6, 7, 0]
 [0, 0, 8, 9, 3, 0]
 [0, 0, 0, 0, 0, 0]]

请问您能否告诉我们您已经尝试了什么,即使只是阅读文档?到目前为止,您已经查阅了哪些资料来源? - Mad Physicist
你只需要找到想要放置B的A的索引范围。类似这样:A[1:4,2:6]=B - anishtain4
当你说“添加值”时,你是指数学加法运算,还是另一种说“放置值”的方式? - Mad Physicist
2个回答

23

如果你想将 B 添加到 A 中,且希望 B 的左上角落在 A 中的索引 (r, c) 处,你可以使用 B 的索引和 shape 属性来实现:

A[r:r+B.shape[0], c:c+B.shape[1]] += B
如果你只想设置元素(覆盖而不是添加),请用 = 替换 +=。在你的特定示例中:
>>> A = np.zeros((5, 6), dtype=int)
>>> B = np.r_[np.arange(2, 10), 3].reshape(3, 3)

>>> r, c = 1, 2

>>> A[r:r+B.shape[0], c:c+B.shape[1]] += B
>>> A
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 2, 3, 4, 0],
       [0, 0, 5, 6, 7, 0],
       [0, 0, 8, 9, 3, 0],
       [0, 0, 0, 0, 0, 0]])

索引操作会产生一个视图,因为这是简单索引,意味着数据不会被复制,这使得对于大型数组来说该操作相当高效。


5
你可以使用numpy.pad将b数组填充到与a相同的形状。请参考numpy.pad
import numpy as np

a = np.array([[0,0,0,0,0,0],
 [0,0,0,0,0,0],
 [0,0,0,0,0,0],
 [0,0,0,0,0,0],
 [0,0,0,0,0,0]])

b = np.array([[2,3,4],
 [5,6,7],
 [8,9,3]])


b = np.pad(b, ((1,1) , (2,1)), mode = 'constant', constant_values=(0, 0))

print(a+b)

填充后 b 将会变成

[[0 0 0 0 0 0]
 [0 0 2 3 4 0]
 [0 0 5 6 7 0]
 [0 0 8 9 3 0]
 [0 0 0 0 0 0]]

a+b将会是

[[0 0 0 0 0 0]
 [0 0 2 3 4 0]
 [0 0 5 6 7 0]
 [0 0 8 9 3 0]
 [0 0 0 0 0 0]]
((1,1) , (2,1)) 表示在矩阵顶部和底部各添加一行,在左侧添加两列,在右侧添加一列。由于 mode = 'constant', constant_values=(0, 0),所以添加的所有行和列都是零。
因此,您可以输入要添加矩阵的索引。

虽然不如创建一个 A 视图的反向方法高效,但仍然很聪明。+1 - Mad Physicist
@MadPhysicist 是的,我认为你的答案更有效率,因为我的答案使用了更多的内存。谢谢!我也给你点赞。 - Echan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接