【问题标题】:How can I add a small matrix into a big one with numpy?如何使用 numpy 将一个小矩阵添加到一个大矩阵中?
【发布时间】:2019-04-07 00:31:59
【问题描述】:

我试图弄清楚如何获取一个小矩阵(下面的矩阵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]]

【问题讨论】:

  • 能否请您告诉我们您的尝试,即使这只是意味着阅读文档?到目前为止,您咨询过哪些来源?
  • 你只需要找到你想要放置 B 的 A 的索引范围。比如:A[1:4,2:6]=B
  • 当您说“添加值”时,您是指数学加法运算,还是说“放置值”的另一种方式?

标签: python arrays numpy matrix


【解决方案1】:

如果您想将B 添加到A 并使用B 的左上角在A 中索引(r, c),您可以使用索引和shape 属性来完成B:

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]])

索引操作会在A 中生成一个视图,因为它是简单的索引,这意味着数据不会被复制,这使得操作对于大型数组相当有效。

【讨论】:

    【解决方案2】:

    您可以将 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)) 表示您在顶部添加 1 行,在底部添加 1 行,在左侧添加 2 列,在右侧添加 1 列。由于mode = 'constant', constant_values=(0, 0),所有添加的行和列都为零。

    这样就可以输入要添加矩阵的索引了

    【讨论】:

    • 不如在 A 中创建视图的反向方法高效,但仍然很聪明。 +1
    • @MadPhysicist 是的,我认为您的回答更有效,因为我的回答使用更多内存。谢谢!也为你 +1。
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    相关资源
    最近更新 更多