How to select values using 2 index tensor from a 3D tensor?

Hi I have a 3D tensor im.shape = [1,256,256]. I also have the long tensor of indices h = [0, 4, 8, … 244, 248, 252] and w = [0, 4, 8, … 244, 248, 252]. both h and w have len = 64. I want to create 64x64 tensor from the im tensor with the values taken from im from index select from both h and w.

``````like
t =
tensor([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16],
[17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]])

x= torch.tensor([0,2,4,6,8,10,12,14]).long()
tensor([ 0,  2,  4,  6,  8, 10, 12, 14])

y = torch.tensor([0,2,4,6,8,10,12,14]).long()
tensor([ 0,  2,  4,  6,  8, 10, 12, 14])

``````

I want the out put like this

``````tensor([[ 1,  3,  5,  7,  9, 11, 13, 15],
[17, 19, 21, 23, 25, 27, 29, 31]])
``````

This should work:

``````t.gather(1, torch.stack((x, y)))
``````
1 Like

It worked only for the output as I have wriiten above but I need different output

``````t
tensor([[  1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
15,  16],
[ 17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,
31,  32],
[ 33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,
47,  48],
[ 49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,
63,  64],
[ 65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,
79,  80],
[ 81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,
95,  96],
[ 97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
111, 112],
[113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
127, 128],
[129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
143, 144],
[145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158,
159, 160],
[161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
175, 176],
[177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
191, 192],
[193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206,
207, 208],
[209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222,
223, 224],
[225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238,
239, 240],
[241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
255, 256]])
x= torch.tensor([0,2,4,6,8,10,12,14]).long()
tensor([ 0,  2,  4,  6,  8, 10, 12, 14])

y = torch.tensor([0,2,4,6,8,10,12,14]).long()
tensor([ 0,  2,  4,  6,  8, 10, 12, 14])

``````

The output I want is like this

``````tensor([[ 1,  3,  5,  7,  9, 11, 13, 15],

[33, 35, 37, 39, 41, 43, 45, 47]
....
....
[209,211, 213,  215,  217,  219, 221,223],

[ 241, 243,  245, 247, 249, 251,  253,255]])

``````

I should take the index value of`[xi, yi]` from t tensor. and create ’`shape(x) x shape(y) '` tensor.

In that case, you can just index `t`:

``````out = t[x[:, None], y]
print(out)
> tensor([[  1,   3,   5,   7,   9,  11,  13,  15],
[ 33,  35,  37,  39,  41,  43,  45,  47],
[ 65,  67,  69,  71,  73,  75,  77,  79],
[ 97,  99, 101, 103, 105, 107, 109, 111],
[129, 131, 133, 135, 137, 139, 141, 143],
[161, 163, 165, 167, 169, 171, 173, 175],
[193, 195, 197, 199, 201, 203, 205, 207],
[225, 227, 229, 231, 233, 235, 237, 239]])
``````

The last rows will be different, since in your example you’ve indexed row15 and row13.

Thank yo, It worked.