Fonction torch.index_copy de PyTorch


Pytorch torch 参考手册Manuel de référence Pytorch torch

torch.index_copyest une fonction de PyTorch utilisée pour copier le tenseur source vers les positions d'index spécifiées. Elle, selon la dimension spécifiéedim, àindexles positions d'index spécifiées, copiesourcela valeur de.

ettorch.index_addLa différence est,index_copyécrase plutôt que d'accumuler.

Définition de fonction

torch.index_copy(input, dim, index, source)

Parameters:

  • input(Tensor) : tenseur d'entrée.
  • dim(int) : la dimension de l'index.
  • index(Tensor) : un tenseur d'entiers unidimensionnel spécifiant les positions vers lesquelles copier.
  • source(Tensor) : le tenseur source, les valeurs à copier.

Valeur de retour:

  • torch.Tensor: renvoie le tenseur modifié.

Exemple d'utilisation

Exemple

import torch

# Créer le tenseur d'entrée
input = torch.randn(4, 5)

# Créer l'index et la source
index = torch.tensor([0, 2, 3])
source = torch.randn(3, 5)

# Copier le long de dim=0
output = torch.index_copy(input, dim=0, index=index, source=source)

print(Entrée :)
print(input)
print(nSource :)
print(source)
print(nLe résultat après copie aux positions [0, 2, 3] :)
print(output)

La sortie est :

输入:
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]])

Exemple

import torch

# Copier le long de 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(Entrée :)
print(input)
print(nSource :)
print(source)
print(nLe résultat après copie aux positions [1, 3] :)
print(output)

La sortie est :

输入:
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.]])

Exemple

import torch

# Construire un grand tenseur
# Supposons que nous devions fusionner les résultats de plusieurs petits lots en un seul grand lot

# Tenseur cible
batch_size = 8
feature_dim = 4
output = torch.zeros(batch_size, feature_dim)

# Simuler les résultats de plusieurs petits lots
mini_batches = [
    torch.randn(2, feature_dim),
    torch.randn(3, feature_dim),
    torch.randn(1, feature_dim)
]

# La position où chaque lot doit être placé
indices = [0, 2, 5]

# Copier chaque lot dans l'ordre
for idx, batch in zip(indices, mini_batches):
    # Créer un index de taille correspondante
    index = torch.arange(idx, idx + len(batch))
    output = torch.index_copy(output, dim=0, index=index, source=batch)

print(Forme de sortie finale :, output.shape)
print(output)

La sortie est :

最终输出形状: 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]])

Remarque :torch.index_copyne modifie pas le tenseur d'entrée d'origine, mais renvoie un nouveau tenseur.index_copyest une opération d'écrasement, contrairement àtorch.index_addl'opération d'accumulation est différente.


Pytorch torch 参考手册Manuel de référence Pytorch torch

Autres extensions