Best way to get the first n rows from a NX Tensor

Hey all, newbie here with a newbie question :wave:

I’m wondering what’s the easier way to get the first n rows from a multi-dimensional tensor.

For instance, If I have a 3 dimension tensor like this:

t = Nx.tensor([
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8]
])

#Nx.Tensor<
  s64[3][3]
  [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8]
  ]
>

How can I get the first 2 rows? I mean [[0, 3, 6], [1, 4, 7]].

A simple solution is to transpose the tensor and then get the first 2 elements, like:

Nx.transpose(t)[0..1]

#Nx.Tensor<
  s64[2][3]
  [
    [0, 3, 6],
    [1, 4, 7]
  ]
>

But I was wondering if there is a more straightforward way to do that?
I’m asking because I have seen that with python (numpy) you can do that with array[0:2].
This is just a curiosity, is not based on any particular needs.

❯ python3
>>> import numpy as np
>>> x1 = [1, 2, 3]
>>> x2 = [4, 5, 6]
>>> x3 = [7, 8, 9]
>>> X = np.column_stack([x1, x2, x3])
>>> X
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])
>>> X[0:2]
array([[1, 4, 7],
       [2, 5, 8]])

Thank you all in advance :bowing_man:
Cheers :v:

1 Like

Ops. my fault. :man_facepalming:
I have just realized that the created tensor in Nx is different to the array created in numpy. I didn’t realize it before because the tensor that I used as example was 3x3, but if I use a not squared tensor (eg. 3x2) it is evident.

x = Nx.tensor([
  [0, 1],
  [2, 3],
  [4, 5]
])

# let's get the shape
Nx.shape(x)
{3, 2}

Is not the same of:

import numpy as np
x1 = [0, 1]
x2 = [2, 3]
x3 = [4, 5]
X = np.column_stack([x1, x2, x3])

>>> X
array([[0, 2, 4],
       [1, 3, 5]])

>>> X.shape
(2, 3)

Basically, I need to transpose the tensor in Elixir to have the equivalent of the numpy array:

x = Nx.tensor([
  [0, 1],
  [2, 3],
  [4, 5]
])

# let's get the shape
Nx.shape(x)
{3, 2}

# and transpose it
Nx.transpose(x)
#Nx.Tensor<
  s64[2][3]
  [
    [0, 2, 4],
    [1, 3, 5]
  ]
>

:man_facepalming:

1 Like
t = Nx.tensor([
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8]
])

t
|> Nx.slice([0, 0], [3, 2])  # slice from index (0, 0) and take 3 and 2 elements respectively along each axis
|> Nx.transpose()

returns

#Nx.Tensor<
  s64[2][3]
  [
    [0, 3, 6],
    [1, 4, 7]
  ]
>
1 Like

Thank youuuu @Aetherus :bowing_man: