【发布时间】: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.multiply、np.dot 和 np.matmul,但我一直面临维度问题。谁能帮我解决这个问题?
下面的代码展示了我想要执行的操作,去掉了for循环:
for i, m in enumerate(arr):
result[i] = mask[i] * arr[i]
【问题讨论】:
标签: python arrays numpy matrix pytorch