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

AI Thread Summary
In NumPy, the shape of a 3D array is represented as (depth, rows, columns), which can be counterintuitive since one might expect dimensions to be added from the right. The outermost axis corresponds to the number of layers, followed by rows and then columns, leading to the confusion about indexing. The discussion highlights that while the structure may seem nested, in memory, all elements are stored linearly, and the order of indexing remains consistent regardless of whether row-major or column-major storage is used. The choice to add new dimensions to the left is a design decision that some find perplexing, but it aligns with how multi-dimensional data is typically structured in programming. Understanding this hierarchy is crucial for effectively working with NumPy arrays.
fog37
Messages
1,566
Reaction score
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
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.[/size]
 
Last edited:
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?
 
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
 
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.
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I had a Microsoft Technical interview this past Friday, the question I was asked was this : How do you find the middle value for a dataset that is too big to fit in RAM? I was not able to figure this out during the interview, but I have been look in this all weekend and I read something online that said it can be done at O(N) using something called the counting sort histogram algorithm ( I did not learn that in my advanced data structures and algorithms class). I have watched some youtube...

Similar threads

Back
Top