3

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?

1
  • You can always test that you did it right by using print(a) which formats it so that you can tell what's a row and what's a column. Commented Mar 4, 2013 at 17:58

4 Answers 4

4

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you so much, both you and @drewk both provided exactly what I needed.. I appreciate the the straight talk, I find that a lot of the python related "features" could really use more forward explanations. Thanks again!
1

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)]

Comments

1

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.

Comments

1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.