secumind
secumind

Reputation: 1141

Understanding Matrix to List of List and then Numpy Array

I want to construct a matrix like:

    Col1 Col2 Col3 Coln
row1  1    2    4    2     
row2  3    8    3    3
row3  8    7    7    3
rown  n    n    n    n

I have yet to find anything in the python documentation that states how a list of list is assembled, is it like:

a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],[n,n,n,n]]

Where each row is a list item or should it be that each column is a list item:

b = [[1,3,8,n],[2,8,7,n],[4,3,7,n],[2,3,3,n]]

I would think that this would be a common question but I can't seem to find a straight answer.

Based on the documentation I'm guessing that I can convert this to a numpy array by simply:

np.array(a)

Can anyone help?

Upvotes: 3

Views: 3975

Answers (4)

dawg
dawg

Reputation: 103744

Use the first convention. If transpose needed:

>>> a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],['n','n','n','n']]
>>> trans=[]
>>> for i in range(len(a)):
...    trans.append([row[i] for row in a])
... 
>>> trans
[[1, 3, 8, 'n'], [2, 8, 7, 'n'], [4, 3, 7, 'n'], [2, 3, 3, 'n']]

An element is then a[row][col] vs trans[col][row] (with respect to a of your example)

The first is used by Python and that is easily seen why you should use the first convention when laid out:

a = [[1,2,4,2],
     [3,8,3,3],
     [8,7,7,3],
     ['n','n','n','n']]

Certainly when you use numpy, use the first convention since that is used by numpy:

>>> np.array(a)
array([['1', '2', '4', '2'],
       ['3', '8', '3', '3'],
       ['8', '7', '7', '3'],
       ['n', 'n', 'n', 'n']], 
      dtype='|S1')
>>> np.array(trans)
array([['1', '3', '8', 'n'],
       ['2', '8', '7', 'n'],
       ['4', '3', '7', 'n'],
       ['2', '3', '3', 'n']], 
      dtype='|S1')

Note: numpy converts the ints to strings because of the 'n' in the final row/col.

When you actual start to print that table, here is a way:

def pprint_table(table):
    def format_field(field, fmt='{:,.0f}'):
        if type(field) is str: return field
        if type(field) is tuple: return field[1].format(field[0])
        return fmt.format(field)     

    def get_max_col_w(table, index):
        return max([len(format_field(row[index])) for row in table])         

    col_paddings=[get_max_col_w(table, i) for i in range(len(table[0]))]
    for i,row in enumerate(table):
        # left col
        row_tab=[row[0].ljust(col_paddings[0])]
        # rest of the cols
        row_tab+=[format_field(row[j]).rjust(col_paddings[j]) for j in range(1,len(row))]
        print(' '.join(row_tab))                

pprint_table([
        ['','Col 1', 'Col 2', 'Col 3', 'Col 4'],
        ['row 1', '1','2','4','2'],
        ['row 2','3','8','3','3'],
        ['row 3','8','7','7','3'],
        ['row 4', 'n','n','n','n']]) 

Prints:

      Col 1 Col 2 Col 3 Col 4
row 1     1     2     4     2
row 2     3     8     3     3
row 3     8     7     7     3
row 4     n     n     n     n

Upvotes: 1

Stuart
Stuart

Reputation: 885

Since you mention "matrix" let me also add that you have the np.matrix() option as well.

For example: You can use

A = [[1,2,3],[4,5,6],[7,8,9]]

to create a list (of lists), with each inner list representing a row.

Then

AA = np.array(A)

will create a 2D array with the appearance of a matrix, but not all the properties of a matrix.

Whereas

AM = np.matrix(A)

will create a matrix.

If you perform arithmetic operations on these two then you'll see the difference. For example

AA**2

will square each element in the 2D array. However

AM**2

will perform matrix multiplication of AM by itself.

BTW. The above usage assumes "import numpy as np" of course.

Upvotes: 1

Andrew Clark
Andrew Clark

Reputation: 208415

You want the first version:

a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],[n,n,n,n]]

When accessing an element in a matrix, you typically use matrix[row][col], so with the above Python list format a[i] would give you row i, and a[i][j] would give you the jth element from the ith row.

To convert it to a numpy array, np.array(a) is the correct method.

Upvotes: 4

Ionut Hulub
Ionut Hulub

Reputation: 6326

This: a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],[n,n,n,n]] will create the list you want, and yes, np.array(a) will convert it to a numpy array.

Also, this is the 'pythonish' was of creating an array with m rows and n columns (and setting all the elements to 0):

a = [[0 for i in range(n)] for j in range(m)]

Upvotes: 1

Related Questions