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.