# python – How to define a two-dimensional array?

## python – How to define a two-dimensional array?

Youre technically trying to index an uninitialized array. You have to first initialize the outer list with lists before adding items; Python calls this

list comprehension.

```
# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5
Matrix = [[0 for x in range(w)] for y in range(h)]
```

#You can now add items to the list:

```
Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range...
Matrix[0][6] = 3 # valid
```

Note that the matrix is y address major, in other words, the y index comes before the x index.

```
print Matrix[0][0] # prints 1
x, y = 0, 6
print Matrix[x][y] # prints 3; be careful with indexing!
```

Although you can name them as you wish, I look at it this way to avoid some confusion that could arise with the indexing, if you use x for both the inner and outer lists, and want a non-square Matrix.

If you really want a matrix, you might be better off using `numpy`

. Matrix operations in `numpy`

most often use an array type with two dimensions. There are many ways to create a new array; one of the most useful is the `zeros`

function, which takes a shape parameter and returns an array of the given shape, with the values initialized to zero:

```
>>> import numpy
>>> numpy.zeros((5, 5))
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
```

Here are some other ways to create 2-d arrays and matrices (with output removed for compactness):

```
numpy.arange(25).reshape((5, 5)) # create a 1-d range and reshape
numpy.array(range(25)).reshape((5, 5)) # pass a Python range and reshape
numpy.array([5] * 25).reshape((5, 5)) # pass a Python list and reshape
numpy.empty((5, 5)) # allocate, but dont initialize
numpy.ones((5, 5)) # initialize with ones
```

`numpy`

provides a `matrix`

type as well, but it is no longer recommended for *any* use, and may be removed from `numpy`

in the future.

#### python – How to define a two-dimensional array?

Here is a shorter notation for initializing a list of lists:

```
matrix = [[0]*5 for i in range(5)]
```

Unfortunately shortening this to something like `5*[5*[0]]`

doesnt really work because you end up with 5 copies of the same list, so when you modify one of them they all change, for example:

```
>>> matrix = 5*[5*[0]]
>>> matrix
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> matrix[4][4] = 2
>>> matrix
[[0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2]]
```