如何在numpy中添加一个小矩阵?

ben*_*der 1 python arrays numpy matrix

我试图弄清楚如何采用一个小矩阵(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]]
Run Code Online (Sandbox Code Playgroud)

矩阵B:

[[2, 3, 4]
 [5, 6, 7]
 [8, 9, 3]]
Run Code Online (Sandbox Code Playgroud)

期望的最终结果:

[[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]]
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 11

如果你想添加BA用的上左角B去索引(r, c)A,你可以使用索引和做shape的属性B:

A[r:r+B.shape[0], c:c+B.shape[1]] += B
Run Code Online (Sandbox Code Playgroud)

如果您只想设置元素(覆盖而不是添加),请替换+==.在您的特定示例中:

>>> 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]])
Run Code Online (Sandbox Code Playgroud)

索引操作产生一个视图A,因为它是简单的索引,这意味着数据没有被复制,这使得操作相当有效的大型阵列.


Ech*_*han 5

您可以使用 a 将 b 数组填充为相同的形状。 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)
Run Code Online (Sandbox Code Playgroud)

填充后 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]]
Run Code Online (Sandbox Code Playgroud)

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]]
Run Code Online (Sandbox Code Playgroud)

((1,1) , (2,1))意味着您在顶部添加 1 行,在底部添加一行,在左侧添加 2 列,在右侧添加 1 列。由于 ,所有添加的行和列都为零mode = 'constant', constant_values=(0, 0)

所以你可以输入你想要添加矩阵的索引