Функция torch.index_copy в PyTorch
Справочное руководство Pytorch torch
torch.index_copyявляется функцией в PyTorch, используемой для копирования исходного тензора в указанные позиции индексов. Она, вдоль указанного измеренияdim, поindexкопирует указанные позиции индексовsourceзначение.
иtorch.index_addРазница в том,index_copyзаключается в перезаписи, а не в накоплении.
Определение функции
torch.index_copy(input, dim, index, source)
Parameters:
input(Tensor): входной тензор.dim(int): размерность индекса.index(Tensor): одномерный целочисленный тензор, задающий позиции, куда копировать.source(Tensor): исходный тензор, значения для копирования.
Возвращаемое значение:
torch.Tensor: возвращает изменённый тензор.
Пример использования
Пример
import torch
# Создание входного тензора
input = torch.randn(4, 5)
# Создайте индекс и источник
index = torch.tensor([0, 2, 3])
source = torch.randn(3, 5)
# Копирование вдоль dim=0
output = torch.index_copy(input, dim=0, index=index, source=source)
print(Вход:)
print(input)
print(nИсточник:)
print(source)
print(nРезультат после копирования в позиции [0, 2, 3]:)
print(output)
# Создание входного тензора
input = torch.randn(4, 5)
# Создайте индекс и источник
index = torch.tensor([0, 2, 3])
source = torch.randn(3, 5)
# Копирование вдоль dim=0
output = torch.index_copy(input, dim=0, index=index, source=source)
print(Вход:)
print(input)
print(nИсточник:)
print(source)
print(nРезультат после копирования в позиции [0, 2, 3]:)
print(output)
Вывод:
输入:
tensor([[ 0.3456, -0.1234, 0.5678, -0.2345, 0.8901],
[-0.5678, 0.1234, -0.6789, 0.2345, -0.1234],
[ 0.7890, -0.3456, 0.1234, -0.5678, 0.3456],
[-0.1234, 0.4567, -0.8901, 0.6789, -0.5678]])
源:
tensor([[-1.2345, 0.5678, -1.2345, 0.5678, -1.2345],
[ 1.5678, -0.6789, 1.5678, -0.6789, 1.5678],
[-0.8901, 1.2345, -0.8901, 1.2345, -0.8901]])
复制到位置 [0, 2, 3] 后的结果:
tensor([[-1.2345, 0.5678, -1.2345, 0.5678, -1.2345],
[-0.5678, 0.1234, -0.6789, 0.2345, -0.1234],
[ 1.5678, -0.6789, 1.5678, -0.6789, 1.5678],
[-0.8901, 1.2345, -0.8901, 1.2345, -0.8901]])
Пример
import torch
# Копирование вдоль dim=1
input = torch.zeros(3, 5)
index = torch.tensor([1, 3])
source = torch.tensor([[10, 20, 30, 40, 50],
[60, 70, 80, 90, 100]])
output = torch.index_copy(input, dim=1, index=index, source=source)
print(Вход:)
print(input)
print(nИсточник:)
print(source)
print(nРезультат после копирования в позиции [1, 3]:)
print(output)
# Копирование вдоль dim=1
input = torch.zeros(3, 5)
index = torch.tensor([1, 3])
source = torch.tensor([[10, 20, 30, 40, 50],
[60, 70, 80, 90, 100]])
output = torch.index_copy(input, dim=1, index=index, source=source)
print(Вход:)
print(input)
print(nИсточник:)
print(source)
print(nРезультат после копирования в позиции [1, 3]:)
print(output)
Вывод:
输入:
tensor([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
源:
tensor([[ 10., 20., 30., 40., 50.],
[ 60., 70., 80., 90., 100.]])
复制到位置 [1, 3] 后的结果:
tensor([[ 0., 10., 0., 20., 0.],
[ 0., 60., 0., 70., 0.],
[ 0., 0., 0., 0., 0.]])
Пример
import torch
# Создать большой тензор
# Предположим, нужно объединить результаты нескольких небольших батчей в один большой батч
# Целевой тензор
batch_size = 8
feature_dim = 4
output = torch.zeros(batch_size, feature_dim)
# Смоделировать результаты нескольких небольших батчей
mini_batches = [
torch.randn(2, feature_dim),
torch.randn(3, feature_dim),
torch.randn(1, feature_dim)
]
# Позиция, куда следует поместить каждый батч
indices = [0, 2, 5]
# Скопировать каждый батч по порядку
for idx, batch in zip(indices, mini_batches):
# Создать индекс соответствующего размера
index = torch.arange(idx, idx + len(batch))
output = torch.index_copy(output, dim=0, index=index, source=batch)
print(Итоговая форма вывода:, output.shape)
print(output)
# Создать большой тензор
# Предположим, нужно объединить результаты нескольких небольших батчей в один большой батч
# Целевой тензор
batch_size = 8
feature_dim = 4
output = torch.zeros(batch_size, feature_dim)
# Смоделировать результаты нескольких небольших батчей
mini_batches = [
torch.randn(2, feature_dim),
torch.randn(3, feature_dim),
torch.randn(1, feature_dim)
]
# Позиция, куда следует поместить каждый батч
indices = [0, 2, 5]
# Скопировать каждый батч по порядку
for idx, batch in zip(indices, mini_batches):
# Создать индекс соответствующего размера
index = torch.arange(idx, idx + len(batch))
output = torch.index_copy(output, dim=0, index=index, source=batch)
print(Итоговая форма вывода:, output.shape)
print(output)
Вывод:
最终输出形状: torch.Size([8, 4])
tensor([[ 0.1234, -0.5678, 0.8901, -0.2345],
[ 0.6789, -0.1234, -0.5678, 0.3456],
[ 1.2345, -0.8901, 0.1234, -0.6789],
[-0.3456, 0.5678, -0.1234, 0.8901],
[ 1.5678, -0.2345, 0.6789, -0.1234],
[-0.8901, 0.3456, 0.5678, -0.8901],
[ 0.0000, 0.0000, 0.0000, 0.0000],
[ 0.0000, 0.0000, 0.0000, 0.0000]])
Примечание:torch.index_copyне изменяет исходный входной тензор, а возвращает новый тензор.index_copyявляется операцией перезаписи, в отличие отtorch.index_addоперация накопления отличается.
Другие расширения