Why are new dimensions added to the left in numpy arrays?

In summary, the conversation discussed the basics of 1D and 2D Numpy arrays, as well as how to create and address them. It also touched on the concept of 3D arrays, which are composed of nested lists and can be addressed using indices. The confusion arose when trying to determine the shape of a 3D array, as numpy shows the sizes of the axes from outside-inwards. The conversation also mentioned the difference between row-major and column-major storage in memory and how it relates to the order of indexing in numpy. Finally, it was noted that while in reality everything is stored flat in memory, the concept of columns being "nested" under rows can help with understanding the order of indexing.
  • #1
fog37
1,569
108
TL;DR Summary
3D numpy array indices and array shape
Hello,
I am clear on 1D and 2D Numpy arrays, how to create them and address them).
  • 1D array: single list
  • 2D array: list containing multiple lists as elements
  • 3D array: list containing lists which contain lists as elements
Array elements can be address using indices as a[], a[][], a[][][] respectively.

I have a question about 3D arrays like the one below:
1614297403478.png


I would say that it is a 2x4x3 array but that is not correct when I use the command
Python:
array_example.shape
. The result is (3,2,4). My understanding is that shape should give (row, column, layer). My interpretation is that it is a 3D array composed of 3 identical 2x4 2D arrays
1614297608807.png

The command shape seem have the first integer in the tuple (, , ) represents the number of layers of the 3D array instead..

Thanks for any advice.
 
Last edited:
Technology news on Phys.org
  • #2
In numpy, arrays are "nested" structures. In 2D arrays, you have rows, and under each row, you have columns. So, columns are nested under rows.

Similarly, for 3D arrays, the outermost axes is the "depth" (layer), under which you have rows, and then columns.

Therefore, when you execute np.reshape(array_example), numpy will show you the sizes of the axes from outside-inwards. In your example, there are 3 layers; inside each layer you have 2 rows, and under each row, there are 4 columns.

A bit perplexing. But that's how it works.

Also see this question on Stack Overflow:
https://stackoverflow.com/questions/22981845/3-dimensional-array-in-numpy

Edit: Fixed grammar.
 
Last edited:
  • Like
Likes fog37
  • #3
Wrichik Basu said:
In numpy, arrays are "nested" structures. In 2D arrays, you have rows, and under each row, you have columns. So, columns are nested under rows.

Similarly, for 3D arrays, the outermost axes is the "depth" (layer), under which you have rows, and then columns.

Therefore, when you execute np.reshape(array_example), numpy will show you the sizes of the axes from outside-inwards. In your example, there are 3 layers; inside each layer you have 2 rows, and under each row, there are 4 columns.

A bit perplexing. But that's how it works.

Also see this question on Stack Overflow:
https://stackoverflow.com/questions/22981845/3-dimensional-array-in-numpy

Edit: Fixed grammar.
Thank you. Now I see. It makes sense now.

I read about row-major and column-major in relation to how array data elements are stored linearly in memory. Apparently numpy uses row-major (column indices change the fastest) when the array elements are arranged in line, row by row from top to bottom.

What is the connection between row-major and the fact that the order is (depth, row, column)?
You mention that "...In 2D arrays, you have rows, and under each row, you have columns. So, columns are nested under rows..."

In what sense are columns nested under rows?
 
  • #4
T
The array shape is (4,3,2) which mean 4 arrays (each array is 2x3). So, in 3D arrays, axis 0 is reserved to the depth, axis 1 to rows, and axis 2 to columns: (dim along axis 0, dim along axis 1, dim along axis 2).

the first 2D array is the top one

1614347010838.png


the first 2D array in the stack is the top one (see below). That would be the first nested list of lists when we define the array. The confusion arises because the axis 0 here counts the layers while in 2D arrays it referred to the rows of 2D arrays.
1614347174263.png
 
  • #5
fog37 said:
What is the connection between row-major and the fact that the order is (depth, row, column)?
There isn't any connection, as far as I can say. In Numpy, you can specify which style you want to store the array — the C-style (row major) or Fortran(F)-style (column major). In either style, the order of indexing the array will be the same.
fog37 said:
You mention that "...In 2D arrays, you have rows, and under each row, you have columns. So, columns are nested under rows..."

In what sense are columns nested under rows?
If you think in terms of memory, everything is flat. There is no nesting of any kind. I said that columns can be thought to be "nested" under rows because that will allow you to remember which comes first.

Simple logic says that new dimensions should be added to the right. I don't understand why the creators of numpy decided to add new dimensions to the left instead. Just results in confusion.
 
  • Like
Likes fog37

FAQ: Why are new dimensions added to the left in numpy arrays?

What is a 3D Numpy Array?

A 3D Numpy Array is a data structure in the Python programming language that allows for the storage and manipulation of multi-dimensional data. It is mainly used for scientific computing and data analysis.

How are indices used in 3D Numpy Arrays?

Indices are used to access specific elements within a 3D Numpy Array. Each element in the array is assigned a unique index, which can be used to retrieve its value or perform operations on it.

How are 3D Numpy Array indices numbered?

3D Numpy Array indices are numbered starting from 0, with the first index representing the row, the second index representing the column, and the third index representing the depth. This numbering convention follows the Cartesian coordinate system.

Can 3D Numpy Array indices be negative?

Yes, 3D Numpy Array indices can be negative. Negative indices are used to access elements from the end of the array, with -1 representing the last element, -2 representing the second last element, and so on.

What happens when indices are out of range in a 3D Numpy Array?

If indices are out of range in a 3D Numpy Array, an error will be raised. It is important to ensure that the indices used are within the range of the array to avoid errors and unexpected results.

Similar threads

Back
Top