[Tutor] Advice on multi-dimensional data storage
Steven D'Aprano
steve at pearwood.info
Wed Mar 16 09:21:33 EDT 2016
On Wed, Mar 16, 2016 at 08:36:59AM +0000, Matt Williams wrote:
> Dear Tutors,
>
> I am looking for some advice. I have some data that has three dimensions to
> it. I would like to store it such that one could manipulate (query/ update/
> etc.) by dimension - so it would be feasible to ask for all of the data
> that shares a value in d1, or iterate over all of the values via d2.
As a beginner, you should start with the simplest thing that works:
nested lists. If that's not suitable, perhaps too slow, then start to
look into more complex solutions, like numpy arrays, or a database.
Here's a two dimensional array using nested lists:
arr = [ [1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12] ]
Three rows x 4 columns. Easy, right? Now let's make it three
dimensional. It looks a bit uglier, but that's because we're trying to
write a three dimensional array in two dimensional text:
arr3D = [
# Block 0, 3 rows by 4 columns.
[ [1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12] ],
# Block 1.
[ [0, 0, 0, 0],
[1, 2, 4, 8],
[2, 4, 6, 8] ],
# Block 2.
[ [0, 1, 2, 3],
[1, 2, 4, 8],
[2, 6, 10, 14] ]
]
Remember that Python counts positions starting from zero, not one, so it
is row 0, 1, 2 not row 1, 2, 3.
To access an individual item, give each index in square brackets:
py> arr3D[0][2][3] # block 0, row 2, column 3
12
Return an entire block:
py> arr3D[1] # block 1 is 3 rows x 4 columns
[[0, 0, 0, 0], [1, 2, 4, 8], [2, 4, 6, 8]]
Return an entire row:
py> arr3D[1][2] # row 2 of block 1
[2, 4, 6, 8]
There's no easy way to return a column, but we can use a "list
comprehension" to extract one out of a block:
py> [row[3] for row in arr3D[1]] # extract column 3 of block 1
[0, 8, 8]
Hope this helps!
--
Steve
More information about the Tutor
mailing list