【问题标题】:Insert matrix inside another matrix using numpy without overwriting some original values使用 numpy 在另一个矩阵中插入矩阵而不覆盖一些原始值
【发布时间】:2021-06-10 00:29:04
【问题描述】:

我需要使用 numpy 在另一个矩阵中插入一个矩阵

我需要插入的矩阵是这样的:

tetraminos = [[0, 1, 0], 
              [1, 1, 1]]

而另一个矩阵是这样的:

board = numpy.array([
    [6,0,0,0,0,0,0,0,0,0],
    [6,0,0,0,0,0,0,0,0,0]
])

我实际使用的代码:

board[0:0 + len(tetraminos), 0:0 + len(tetraminos[0])] = tetraminos

我得到的问题矩阵是这个:

wrong_matrix = numpy.array([
        [[0,1,0,0,0,0,0,0,0,0],
        [1,1,1,0,0,0,0,0,0,0]]
])

而预期的结果是:

expected_result = numpy.array([
    [6,1,0,0,0,0,0,0,0,0],
    [1,1,1,0,0,0,0,0,0,0]
])

错误是,由于矩阵包含 0,当我将其插入新矩阵时,我丢失了第一行中的第一个值(数字 6),而我想保留它

完整代码:

import numpy
if __name__ == '__main__':

    board = numpy.array([
        [6,0,0,0,0,0,0,0,0,0],
        [6,0,0,0,0,0,0,0,0,0]
    ])

    tetraminos = [[0, 1, 0], [1, 1, 1]]

    board[0:0 + len(tetraminos), 0:0 + len(tetraminos[0])] = tetraminos
    print(board)

    expected_result = numpy.array([
        [6,1,0,0,0,0,0,0,0,0],
        [1,1,1,0,0,0,0,0,0,0]
    ])

    exit(1)

【问题讨论】:

  • 您应该添加您的预期输出。
  • 添加了预期的输出并修改了代码:-)
  • 请提供预期的minimal, reproducible example (MRE)。我们应该能够复制并粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。
  • 我明白了,如果代码不是很清楚,我很抱歉。我将从头开始创建一个新的最小示例,然后编辑问题
  • 很难看出你在 0 的海洋中做出了什么改变。

标签: python numpy matrix optimization


【解决方案1】:

只要您总是想在其中输入一个常数值,您就可以将您的 tetramino 视为一个掩码并使用 np.putmask 函数:

>>> board = np.array([[6,0,0,0,0,0,0,0,0],[6,0,0,0,0,0,0,0,0]])
>>> board
array([[6, 0, 0, 0, 0, 0, 0, 0, 0],
       [6, 0, 0, 0, 0, 0, 0, 0, 0]])
>>> tetraminos = [[0,1,0],[1,1,1]]
>>> np.putmask(board[0:len(tetraminos),0:len(tetraminos[0])], tetraminos,1)
>>> board
array([[6, 1, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 0, 0, 0, 0, 0, 0]])

【讨论】:

    【解决方案2】:

    您可以分两步完成:

    tetraminos = np.array([0, 1, 0], [1, 1, 1])
    temp = board[0:0 + len(tetraminos), 0:0 + len(tetraminos[0])]                                                                                                                                                                        
    board[0:0 + tetraminos.shape[0], 0:0 + tetraminos.shape[1]] = np.where(tetraminos == 0, temp, tetraminos)                                                                                                                                  
    

    输出:

    array([[6, 1, 0, 0, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 0, 0, 0, 0, 0, 0, 0]])
    

    【讨论】:

      【解决方案3】:

      putmask 的变体

      In [243]: board = np.array([
           ...:     [6,0,0,0,0,0,0,0,0,0],
           ...:     [6,0,0,0,0,0,0,0,0,0]
           ...: ])
      In [244]: tetraminos = np.array([[0, 1, 0],
           ...:               [1, 1, 1]])
      In [245]: aview = board[:tetraminos.shape[0],:tetraminos.shape[1]]
      

      使用tetraminos 作为布尔值来选择aview 的插槽来放置值:

      In [246]: aview[tetraminos.astype(bool)]=1
      In [247]: board
      Out[247]: 
      array([[6, 1, 0, 0, 0, 0, 0, 0, 0, 0],
             [1, 1, 1, 0, 0, 0, 0, 0, 0, 0]])
      

      如果tetraminos 有其他非零值,这可以概括。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多