Franky1
Franky1

Reputation: 484

Counterpart of hstack and vstack in Tensorflow

What would be the correct counterpart of the numpy functions hstack and vstack in Tensorflow?

There is tf.stack and tf.concat in Tensorflow, but i don't know how to use them or use the correct axis value, to achieve the same behaviour in Tensorflow.

Upvotes: 5

Views: 5209

Answers (1)

Dmytro Prylipko
Dmytro Prylipko

Reputation: 5064

You should use the tf.concat with different axis argument to get the same result as with hstack or vstack:

arr1 = np.random.random((2,3))
arr2 = np.random.random((2,3))
arr1
array([[0.72315241, 0.9374959 , 0.18808236],
       [0.74153715, 0.85361367, 0.13258545]])

arr2
array([[0.80159933, 0.8123236 , 0.80555496],
       [0.82570606, 0.4092662 , 0.69123989]])

np.hstack([arr1, arr2])
array([[0.72315241, 0.9374959 , 0.18808236, 0.80159933, 0.8123236 ,
        0.80555496],
       [0.74153715, 0.85361367, 0.13258545, 0.82570606, 0.4092662 ,
        0.69123989]])

np.hstack([arr1, arr2]).shape
(2, 6)

np.vstack([arr1, arr2])
array([[0.72315241, 0.9374959 , 0.18808236],
       [0.74153715, 0.85361367, 0.13258545],
       [0.80159933, 0.8123236 , 0.80555496],
       [0.82570606, 0.4092662 , 0.69123989]])

np.vstack([arr1, arr2]).shape
(4, 3)

t1 = tf.convert_to_tensor(arr1)
t2 = tf.convert_to_tensor(arr2)


tf.concat([t1, t2], axis=1)

<tf.Tensor: id=9, shape=(2, 6), dtype=float64, numpy=
array([[0.72315241, 0.9374959 , 0.18808236, 0.80159933, 0.8123236 ,
        0.80555496],
       [0.74153715, 0.85361367, 0.13258545, 0.82570606, 0.4092662 ,
        0.69123989]])>

tf.concat([t1, t2], axis=1).shape.as_list()
[2, 6]

tf.concat([t1, t2], axis=0)

<tf.Tensor: id=19, shape=(4, 3), dtype=float64, numpy=
array([[0.72315241, 0.9374959 , 0.18808236],
       [0.74153715, 0.85361367, 0.13258545],
       [0.80159933, 0.8123236 , 0.80555496],
       [0.82570606, 0.4092662 , 0.69123989]])>

tf.concat([t1, t2], axis=0).shape.as_list()
[4, 3]

You should use tf.stack only if you want to concatenate tensors along a new axis:

tf.stack([t1, t2]).shape.as_list()
[2, 2, 3]

In other words, tf.stack creates a new dimension and stacks the tensors along in.

Upvotes: 11

Related Questions