Home > front end >  NumPy stack, vstack and sdtack usage
NumPy stack, vstack and sdtack usage

Time:07-13

I am trying to better understand hstack, vstack, and dstack in NumPy.

a = np.arange(96).reshape(2,4,4,3)
print(a)
print(f"dimensions of a:", np.ndim(a))
print(f"Shape of a:", a.shape)
b = np.arange(201,225).reshape(2,4,3)
print(f"Shape of b:", b)
c = np.arange(101,133).reshape(2,4,4)
print(c)
print(f"dimensions of c:", np.ndim(c))
print(f"Shape of c:", c.shape)

a is:

[[[[ 0  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]]]]

and c is:

 [[[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]]]

and b is:

[[[201 202 203]
  [204 205 206]
  [207 208 209]
  [210 211 212]]

 [[213 214 215]
  [216 217 218]
  [219 220 221]
  [222 223 224]]]

How do I reshape c so that I can use hstack correctly: I wish to add one column for each row in each of the dimensions.

How do I reshape b so that I can use vstack correctly: I wish one row for each column in each of the dimensions.

I would like to come up with a general rule on the dimensions to check for the array that needs to be added to an existing array.

CodePudding user response:

You can concatenate to a (2,4,4,3) a

(1,4,4,3)  axis 0
(2,1,4,3)  with axis=1
(2,4,1,3)  axis 2
(2,4,4,1)  axis 3

Read and reread as needed, the np.concatenate docs.

edit

In previous post(s) I've summarized the code of hstack and vstack, though you easily read that via the [source] link in the official docs.

When should I use hstack/vstack vs append vs concatenate vs column_stack?

hstack makes sure all arguments are atleast_1d and does a concatenate on axis 0 or 1. vstack makes sure all are atleast_2d, and does a concatenate on axis 0.

Maybe I should have insisted on seeing your attempts and any errors (and attempts to understand the errors).

For adding c to a:

In [58]: np.hstack((a,c))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [58], in <cell line: 1>()
----> 1 np.hstack((a,c))

File <__array_function__ internals>:5, in hstack(*args, **kwargs)

File ~\anaconda3\lib\site-packages\numpy\core\shape_base.py:345, in hstack(tup)
    343     return _nx.concatenate(arrs, 0)
    344 else:
--> 345     return _nx.concatenate(arrs, 1)

File <__array_function__ internals>:5, in concatenate(*args, **kwargs)

ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 4 dimension(s) and the array at index 1 has 3 dimension(s)

Notice, the error was raised by concatenate, and focuses on the number of dimensions - 4d and 3d. The hstack wrapper did not change inputs at all.

If I add a trailing dimension to c, I get:

In [62]: c[...,None].shape
Out[62]: (2, 4, 4, 1)
In [63]: np.concatenate((a, c[...,None]),axis=3).shape
Out[63]: (2, 4, 4, 4)

Similarly for b:

In [64]: np.concatenate((a, b[...,None,:]),axis=2).shape
Out[64]: (2, 4, 5, 3)

The hstack/vstack docs specify 2nd and 1st axis concatenate. But you want to use axis 2 or 3. So those 'stack' functions don't apply, do they?

  • Related