4.2 stacking vs concatenating#

This lesson illustrates difference between stack, vstack, hstack, column_stack, row_stack and concatenate

import time
import numpy as np

print(time.asctime())
print(np.__version__)
Mon Nov 11 07:57:05 2024
1.26.4

stack#

all arrays must have same shape

both 1d arrays

a = np.random.random(10)
b = np.random.random(10)

print(np.stack([a,b]).shape)
(2, 10)

both 2D

a = np.random.random((10, 1))
b = np.random.random((10, 1))

print(np.stack([a,b]).shape)
(2, 10, 1)
print(np.stack([a,b], axis=1).shape)
(10, 2, 1)
print(np.stack([a,b], axis=2).shape)
(10, 1, 2)
a = np.random.random((10, 2))
b = np.random.random((10, 2))

print(np.stack([a,b]).shape)
(2, 10, 2)
print(np.stack([a,b], axis=0).shape)
(2, 10, 2)
print(np.stack([a,b], axis=1).shape)
(10, 2, 2)
print(np.stack([a,b], axis=2).shape)
(10, 2, 2)
# print(np.stack([a,b], axis=3).shape) # np.AxisError

different shapes

a = np.random.random((10, 2))
b = np.random.random((10, 1))

# print(np.stack([a,b]).shape)  # ValueError
# print(np.stack([a,b], axis=0).shape)  # ValueError
# print(np.stack([a,b], axis=1).shape)  # ValueError

concatenate#

a = np.random.random(10)
b = np.random.random(10)

print(np.concatenate([a,b]).shape)
(20,)
print(np.concatenate([a,b], axis=0).shape)
(20,)
# print(np.concatenate([a,b], axis=1).shape)  # Error
a = np.random.random((10, 1))
b = np.random.random((10, 1))

print(np.concatenate([a,b]).shape)
(20, 1)
print(np.concatenate([a,b], axis=1).shape)
(10, 2)

The shapes of the arrays must be same except in the dimension corresponding to axis

a = np.random.random((10, 2))
b = np.random.random((10, 1))

# print(np.concatenate([a,b], axis=0)) # Error

In above example, axis 0 has 10 but axis 1 has 2 and 1. So, it is not possible to concatenate

print(np.concatenate([a,b], axis=1).shape)
(10, 3)
a = np.random.random((10, 2))
b = np.random.random((10, 2))

print(np.concatenate([a,b]).shape)
(20, 2)
print(np.concatenate([a,b], axis=1).shape)
(10, 4)
# print(np.concatenate([a,b], axis=2).shape)  # AxisError
a = np.random.random((10, 5, 3))
b = np.random.random((10, 5, 3))

print(np.concatenate([a,b]).shape)
(20, 5, 3)
print(np.concatenate([a,b], axis=1).shape)
(10, 10, 3)
print(np.concatenate([a,b], axis=2).shape)
(10, 5, 6)

vstack#

a = np.random.random(10)
b = np.random.random(10)

print(np.vstack([a,b]).shape)
(2, 10)
a = np.random.random((10, 1))
b = np.random.random((10, 1))

print(np.vstack([a,b]).shape)
(20, 1)
a = np.random.random((10, 2))
b = np.random.random((10, 2))

print(np.vstack([a,b]).shape)
(20, 2)
a = np.random.random((10, 2))
b = np.random.random((10, 1))

print(np.hstack([a,b]).shape)
(10, 3)
a = np.random.random((10, 5, 3))
b = np.random.random((10, 5, 3))

print(np.hstack([a,b]).shape)
(10, 10, 3)

hstack#

a = np.random.random(10)
b = np.random.random(10)

print(np.hstack([a,b]).shape)
(20,)
a = np.random.random((10, 1))
b = np.random.random((10, 1))

print(np.hstack([a,b]).shape)
(10, 2)
a = np.random.random((10, 2))
b = np.random.random((10, 2))

print(np.hstack([a,b]).shape)
(10, 4)
a = np.random.random((10, 2))
b = np.random.random((10, 1))

print(np.hstack([a,b]).shape)
(10, 3)
a = np.random.random((10, 5, 3))
b = np.random.random((10, 5, 3))

print(np.hstack([a,b]).shape)
(10, 10, 3)

column stack#

a = np.random.random(10)
b = np.random.random(10)

print(np.column_stack([a,b]).shape)
(10, 2)
a = np.random.random((10, 1))
b = np.random.random((10, 1))

print(np.column_stack([a,b]).shape)
(10, 2)
a = np.random.random((10, 2))
b = np.random.random((10, 2))

print(np.column_stack([a,b]).shape)
(10, 4)
a = np.random.random((10, 2))
b = np.random.random((10, 1))

print(np.column_stack([a,b]).shape)
(10, 3)
a = np.random.random((10, 5, 3))
b = np.random.random((10, 5, 3))

print(np.column_stack([a,b]).shape)
(10, 10, 3)

row stack#

a = np.random.random(10)
b = np.random.random(10)

print(np.row_stack([a,b]).shape)
(2, 10)
a = np.random.random((10, 1))
b = np.random.random((10, 1))

print(np.row_stack([a,b]).shape)
(20, 1)
a = np.random.random((10, 2))
b = np.random.random((10, 2))

print(np.row_stack([a,b]).shape)
(20, 2)

shape has to be same

a = np.random.random((10, 2))
b = np.random.random((10, 1))

# print(np.row_stack([a,b]).shape) ValueError
a = np.random.random((10, 5, 3))
b = np.random.random((10, 5, 3))

print(np.row_stack([a,b]).shape)
(20, 5, 3)

dstack#

depth wise stacking

a = np.random.random(10)
b = np.random.random(10)

print(np.dstack([a,b]).shape)
(1, 10, 2)
a = np.random.random((10, 1))
b = np.random.random((10, 1))

print(np.dstack([a,b]).shape)
(10, 1, 2)
a = np.random.random((10, 2))
b = np.random.random((10, 2))

print(np.dstack([a,b]).shape)
(10, 2, 2)
a = np.random.random((10, 2))
b = np.random.random((10, 1))

# print(np.dstack([a,b]).shape)  # ValueError
a = np.random.random((10, 5, 3))
b = np.random.random((10, 5, 3))

print(np.dstack([a,b]).shape)
(10, 5, 6)

comparison#

1D arrays

a = np.random.random(10)
b = np.random.random(10)

print('concatenate: ', np.concatenate([a,b]).shape)

print('stack        ', np.stack([a,b]).shape)

print('vstack:      ', np.vstack([a,b]).shape)

print('hstack:      ', np.hstack([a,b]).shape)

print('row_stack:   ', np.row_stack([a,b]).shape)

print('column_stack:', np.column_stack([a,b]).shape)

print('dstack:      ', np.dstack([a,b]).shape)
concatenate:  (20,)
stack         (2, 10)
vstack:       (2, 10)
hstack:       (20,)
row_stack:    (2, 10)
column_stack: (10, 2)
dstack:       (1, 10, 2)

2D arrays

a = np.random.random((10, 1))
b = np.random.random((10, 1))

print('concatenate:  ', np.concatenate([a,b]).shape)

print('stack:        ', np.stack([a,b]).shape)

print('vstack:       ', np.vstack([a,b]).shape)

print('hstack:       ', np.hstack([a,b]).shape)

print('row_stack:    ', np.row_stack([a,b]).shape)

print('column_stack: ', np.column_stack([a,b]).shape)

print('dstack:       ', np.dstack([a,b]).shape)
concatenate:   (20, 1)
stack:         (2, 10, 1)
vstack:        (20, 1)
hstack:        (10, 2)
row_stack:     (20, 1)
column_stack:  (10, 2)
dstack:        (10, 1, 2)

2D arrays

a = np.random.random((10, 2))
b = np.random.random((10, 2))

print('concatenate: ', np.concatenate([a,b]).shape)

print('stack:       ', np.stack([a,b]).shape)

print('vstack:      ', np.vstack([a,b]).shape)

print('hstack:      ', np.hstack([a,b]).shape)

print('row_stack:   ', np.row_stack([a,b]).shape)

print('column_stack:',np.column_stack([a,b]).shape)

print('dstack:      ', np.dstack([a,b]).shape)
concatenate:  (20, 2)
stack:        (2, 10, 2)
vstack:       (20, 2)
hstack:       (10, 4)
row_stack:    (20, 2)
column_stack: (10, 4)
dstack:       (10, 2, 2)

2D arrays with different shapes

a = np.random.random((10, 2))
b = np.random.random((10, 1))

# print(np.concatenate([a,b]).shape)  # ValueError

# print(np.stack([a,b]).shape)  # ValueError

# print(np.vstack([a,b]).shape) # ValueError

print('hstack:       ', np.hstack([a,b]).shape)

# print(np.row_stack([a,b]).shape) # ValueError

print('column_stack: ', np.column_stack([a,b]).shape)

# print(np.dstack([a,b]).shape)  # ValueError
hstack:        (10, 3)
column_stack:  (10, 3)

3D arrays

a = np.random.random((10, 5, 3))
b = np.random.random((10, 5, 3))

print('concatenate: ', np.concatenate([a,b]).shape)

print('stack:       ', np.stack([a,b]).shape)

print('vstack:      ', np.vstack([a,b]).shape)

print('hstack:      ', np.hstack([a,b]).shape)

print('row_stack:   ', np.row_stack([a,b]).shape)

print('column_stack:', np.column_stack([a,b]).shape)

print('dstack:      ', np.dstack([a,b]).shape)
concatenate:  (20, 5, 3)
stack:        (2, 10, 5, 3)
vstack:       (20, 5, 3)
hstack:       (10, 10, 3)
row_stack:    (20, 5, 3)
column_stack: (10, 10, 3)
dstack:       (10, 5, 6)

Total running time of the script: ( 0 minutes 0.025 seconds)

Gallery generated by Sphinx-Gallery