PyTorch torch.index_copy-Funktion
PyTorch torch Referenzhandbuch
torch.index_copyist eine Funktion in PyTorch, die verwendet wird, um den Quell-Tensor an die angegebenen Indexpositionen zu kopieren. Sie, entlang der angegebenen Dimensiondim, beiindexdie angegebenen Indexpositionen, kopiertsourceder Wert von.
undtorch.index_addDer Unterschied ist,index_copyüberschreibt statt zu akkumulieren.
Funktionsdefinition
torch.index_copy(input, dim, index, source)
Parameters:
input(Tensor): Eingabe-Tensor.dim(int): die Dimension des Index.index(Tensor): ein eindimensionaler ganzzahliger Tensor, der die Positionen angibt, an die kopiert werden soll.source(Tensor): der Quell-Tensor, die zu kopierenden Werte.
Rückgabewert:
torch.Tensor: gibt den geänderten Tensor zurück.
Anwendungsbeispiel
Beispiel
import torch
# Eingabe-Tensor erstellen
input = torch.randn(4, 5)
# Index und Quelle erstellen
index = torch.tensor([0, 2, 3])
source = torch.randn(3, 5)
# Entlang dim=0 kopieren
output = torch.index_copy(input, dim=0, index=index, source=source)
print(Eingabe:)
print(input)
print(nQuelle:)
print(source)
print(nDas Ergebnis nach dem Kopieren an die Positionen [0, 2, 3]:)
print(output)
# Eingabe-Tensor erstellen
input = torch.randn(4, 5)
# Index und Quelle erstellen
index = torch.tensor([0, 2, 3])
source = torch.randn(3, 5)
# Entlang dim=0 kopieren
output = torch.index_copy(input, dim=0, index=index, source=source)
print(Eingabe:)
print(input)
print(nQuelle:)
print(source)
print(nDas Ergebnis nach dem Kopieren an die Positionen [0, 2, 3]:)
print(output)
Die Ausgabe ist:
输入:
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]])
Beispiel
import torch
# Entlang dim=1 kopieren
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(Eingabe:)
print(input)
print(nQuelle:)
print(source)
print(nDas Ergebnis nach dem Kopieren an die Positionen [1, 3]:)
print(output)
# Entlang dim=1 kopieren
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(Eingabe:)
print(input)
print(nQuelle:)
print(source)
print(nDas Ergebnis nach dem Kopieren an die Positionen [1, 3]:)
print(output)
Die Ausgabe ist:
输入:
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.]])
Beispiel
import torch
# Erstelle einen großen Tensor
# Angenommen, wir müssen die Ergebnisse mehrerer kleiner Batches zu einem großen Batch zusammenführen
# Ziel-Tensor
batch_size = 8
feature_dim = 4
output = torch.zeros(batch_size, feature_dim)
# Simuliere die Ergebnisse mehrerer kleiner Batches
mini_batches = [
torch.randn(2, feature_dim),
torch.randn(3, feature_dim),
torch.randn(1, feature_dim)
]
# Die Position, an der jeder Batch platziert werden soll
indices = [0, 2, 5]
# Kopiere jeden Batch der Reihe nach
for idx, batch in zip(indices, mini_batches):
# Erstellen Sie einen Index mit entsprechender Größe
index = torch.arange(idx, idx + len(batch))
output = torch.index_copy(output, dim=0, index=index, source=batch)
print(Endgültige Ausgabeform:, output.shape)
print(output)
# Erstelle einen großen Tensor
# Angenommen, wir müssen die Ergebnisse mehrerer kleiner Batches zu einem großen Batch zusammenführen
# Ziel-Tensor
batch_size = 8
feature_dim = 4
output = torch.zeros(batch_size, feature_dim)
# Simuliere die Ergebnisse mehrerer kleiner Batches
mini_batches = [
torch.randn(2, feature_dim),
torch.randn(3, feature_dim),
torch.randn(1, feature_dim)
]
# Die Position, an der jeder Batch platziert werden soll
indices = [0, 2, 5]
# Kopiere jeden Batch der Reihe nach
for idx, batch in zip(indices, mini_batches):
# Erstellen Sie einen Index mit entsprechender Größe
index = torch.arange(idx, idx + len(batch))
output = torch.index_copy(output, dim=0, index=index, source=batch)
print(Endgültige Ausgabeform:, output.shape)
print(output)
Die Ausgabe ist:
最终输出形状: 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]])
Hinweis:torch.index_copyändert den ursprünglichen Eingabetensor nicht, gibt aber einen neuen Tensor zurück.index_copyist eine Überschreibungsoperation, im Gegensatz zutorch.index_adddie Akkumulationsoperation ist anders.
Andere Erweiterungen