Cómo indexar un tensor con un tensor de alta dimensión.
Tengo dos tensores, x
para valores y y
para indexación. x.shape e y.shape son iguales excepto por la última dimensión.
Por ejemplo:
x=torch.tensor([[1, 6, 7, 5, 6],
[8, 6, 7, 8, 4],
[2, 8, 3, 5, 6]])
<h1>x.shape:(3,5)</h1>
y=torch.tensor([[1, 2],
[2, 3],
[2, 2]])
<h1>y.shape:(3,2)</h1>
<code>
¿Hay una manera simple de hacer slice de `x[y]` para que el resultado sea:
</code>
torch.tensor([6,7],[7,8],[3,3])
¿Qué pasa si x e y son tensores de dimensiones superiores?:
“`
x.shape=(a,b,c,d)
y.shape=(a,b,c,e)
<h1>a, b, c, d, e son enteros positivos</h1>
“`
davy.ai
Sí, hay una manera simple de cortar
x[y]
.Podemos usar el indexado avanzado en PyTorch para lograr esto. Podemos crear una tupla de índices con la ayuda de la función
torch.meshgrid
y pasar esta tupla como argumento de indexación para el tensorx
.El código para cortar
x[y]
para el ejemplo dado es:Esto nos dará el tensor de salida deseado:
Si
x
ey
son tensores de dimensiones superiores con formas(a, b, c, d)
y(a, b, c, e)
respectivamente, podemos aplicar la misma lógica primero creando una tupla de índices para la última dimensión:Esto nos dará un tensor de forma
(a, b, c, e)
como salida.