【问题标题】:How to multiply a set of masks over an array of n matrices or tensors in python without using loops?python - 如何在不使用循环的情况下将一组掩码乘以python中的n个矩阵或张量数组?
【发布时间】:2021-11-27 04:08:17
【问题描述】:

我有 N 个二进制掩码,以及 N x M 个矩阵。我希望将第 i 个掩码应用于矩阵数组第 i 个索引处的 M 个矩阵。它们的数据类型可以是 torch 张量或 numpy 数组。为了说明,

如果我有一个数组 arr:

arr = torch.rand((2, 3, 3, 3))

arr = tensor([[[[0.2336, 0.4841, 0.4121],
          [0.9342, 0.8496, 0.8332],
          [0.4670, 0.8158, 0.7891]],

         [[0.5791, 0.2391, 0.8501],
          [0.9811, 0.0087, 0.0655],
          [0.6587, 0.3105, 0.0931]],

         [[0.8892, 0.8104, 0.9181],
          [0.1605, 0.5280, 0.0905],
          [0.2149, 0.8851, 0.7125]]],


        [[[0.9969, 0.8589, 0.7479],
          [0.4013, 0.5922, 0.0252],
          [0.9267, 0.8123, 0.0711]],

         [[0.7931, 0.6477, 0.0947],
          [0.5969, 0.7751, 0.5662],
          [0.1785, 0.0310, 0.9135]],

         [[0.1490, 0.3623, 0.3670],
          [0.3710, 0.7887, 0.1310],
          [0.2052, 0.0244, 0.6891]]]])

我使用以下方法生成掩码:

mask = arr[:, 0, 0:, :] > 0.5

例如:

mask = tensor([[[False, False, False],
         [ True,  True,  True],
         [False,  True,  True]],

        [[ True,  True,  True],
         [False,  True, False],
         [ True,  True, False]]])

即形状 (2, 3, 3)。对于每组 3 x 3 x 3 矩阵,我想乘以相应的单个掩码,即

result = mask[i] * arr[i, :, :, :]

或者理想的结果应该是:

result = tensor([[[[0, 0, 0],
          [0.9342, 0.8496, 0.8332],
          [0, 0.8158, 0.7891]],

         [[0, 0, 0],
          [0.9811, 0.0087, 0.0655],
          [0, 0.3105, 0.0931]],

         [[0, 0, 0],
          [0.1605, 0.5280, 0.0905],
          [0, 0.8851, 0.7125]]],


        [[[0.9969, 0.8589, 0.7479],
          [0, 0.5922, 0],
          [0.9267, 0.8123, 0]],

         [[0.7931, 0.6477, 0.0947],
          [0, 0.7751, 0],
          [0.1785, 0.0310, 0]],

         [[0.1490, 0.3623, 0.3670],
          [0, 0.7887, 0],
          [0.2052, 0.0244, 0]]]])

我在一段运行时间相对较长的代码中使用它,因此我想避免使用可能会破坏代码的循环。我曾尝试使用np.multiplynp.dot 和 np.matmul,但我一直面临维度问题。谁能帮我解决这个问题?

下面的代码展示了我想要执行的操作,去掉了for循环:

for i, m in enumerate(arr):
  result[i] = mask[i] * arr[i]

【问题讨论】:

    标签: python arrays numpy matrix pytorch


    【解决方案1】:

    通过使用整数索引,您从arr(第二轴)中删除了一个维度,并且您无法广播形状为 (2, 3, 3) 和 (2, 3, 3, 3) 的数组)。为了使它们再次兼容,您可以通过重塑来添加尺寸:

    mask.reshape((2, 1, 3, 3)) * arr
    

    或者使用切片保持维度从一开始:

    mask = arr[:, :1, :, :] > 0.5
    

    然后你就可以mask * arr

    【讨论】:

      猜你喜欢
      • 2022-11-15
      • 2015-10-08
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多