The Python Book

matrix numpy
20160416

## Add a column of zeros to a matrix

``````x= np.array([ [9.,4.,7.,3.], [ 2., 0., 3., 4.], [ 1.,2.,3.,1.] ])

array([[ 9.,  4.,  7.,  3.],
[ 2.,  0.,  3.,  4.],
[ 1.,  2.,  3.,  1.]])``````

``````np.c_[ np.zeros(3), x]

array([[ 0.,  9.,  4.,  7.,  3.],
[ 0.,  2.,  0.,  3.,  4.],
[ 0.,  1.,  2.,  3.,  1.]])``````

Watchout: np.c_ takes SQUARE brackets, not parenthesis!

There is also an `np.r_[ ... ]` function. Maybe also have a look at vstack and hstack. See stackoverflow.com/a/8505658/4866785 for examples.

matrix dotproduct numpy
20160122

# Matrix multiplication : dot product

``````a= np.array([[2., -1., 0.],[-3.,6.0,1.0]])

array([[ 2., -1.,  0.],
[-3.,  6.,  1.]])

b= np.array([ [1.0,0.0,-1.0,2],[-4.,3.,1.,0.],[0.,3.,0.,-2.]])

array([[ 1.,  0., -1.,  2.],
[-4.,  3.,  1.,  0.],
[ 0.,  3.,  0., -2.]])

np.dot(a,b)

array([[  6.,  -3.,  -3.,   4.],
[-27.,  21.,   9.,  -8.]])``````

# Dot product of two vectors

Take the first row of above a matrix and the first column of above b matrix:

``````np.dot( np.array([ 2., -1.,  0.]), np.array([ 1.,-4.,0. ]) )
6.0``````

# Normalize a matrix

Normalize the columns: suppose the columns make up the features, and the rows the observations.

Calculate the 'normalizers':

``````norms=np.linalg.norm(a,axis=0)

print norms
[ 3.60555128  6.08276253  1. ]``````

Turn a into normalized matrix an:

``````an = a/norms

print an

[[ 0.5547002  -0.16439899  0.        ]
[-0.83205029  0.98639392  1.        ]]``````
matrix colsum numpy
20150728

# Dot product used for aggregation of an unrolled matrix

Aggregations by column/row on an unrolled matrix, done via dot product. No need to reshape.

## Column sums

Suppose this 'flat' array ..

``a=np.array( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ] )``

.. represents an 'unrolled' 3x4 matrix ..

``````a.reshape(3,4)

array([[ 1,  2,  3,  4],
[ 5,  6,  7,  8],
[ 9, 10, 11, 12]])``````

.. of which you want make the sums by column ..

``````a.reshape(3,4).sum(axis=0)
array([15, 18, 21, 24])``````

This can also be done by the dot product of a tiled eye with the array!

``````np.tile(np.eye(4),3)

array([[ 1,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0],
[ 0,  1,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0],
[ 0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  1,  0],
[ 0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  1]])``````

Dot product:

``````np.tile(np.eye(4),3).dot(a)
array([ 15.,  18.,  21.,  24.])``````

## Row sums

Similar story :

``````a.reshape(3,4)
array([[ 1,  2,  3,  4],
[ 5,  6,  7,  8],
[ 9, 10, 11, 12]])``````

Sum by row:

``````a.reshape(3,4).sum(axis=1)
array([10, 26, 42])``````

Can be expressed by a Kronecker eye-onesie :

``````np.kron( np.eye(3), np.ones(4) )

array([[ 1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0],
[ 0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  0,  0],
[ 0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1]])``````

Dot product:

``````np.kron( np.eye(3), np.ones(4) ).dot(a)
array([ 10.,  26.,  42.])``````

For the np.kron() function see Kronecker product

matrix outer_product numpy
20150727

The dot product of two matrices (Eg. a matrix and it's tranpose), equals the sum of the outer products of the row-vectors & column-vectors.

``````a=np.matrix( "1 2; 3 4; 5 6" )

matrix([[1, 2],
[3, 4],
[5, 6]])``````

Dot product of A and A^T :

``````np.dot( a, a.T)

matrix([[ 5, 11, 17],
[11, 25, 39],
[17, 39, 61]])``````

Or as the sum of the outer products of the vectors:

``````np.outer(a[:,0],a.T[0,:])

array([[ 1,  3,  5],
[ 3,  9, 15],
[ 5, 15, 25]])

np.outer(a[:,1],a.T[1,:])

array([[ 4,  8, 12],
[ 8, 16, 24],
[12, 24, 36]])``````

``````np.outer(a[:,0],a.T[0,:]) + np.outer(a[:,1],a.T[1,:])

array([[ 5, 11, 17],
[11, 25, 39],
[17, 39, 61]])``````

.. and yes it is the same as the dot product!

Note: for above, because we are forming the dot product of a matrix with its transpose, we can also write it as (not using the transpose) :

``np.outer(a[:,0],a[:,0]) + np.outer(a[:,1],a[:,1])``

Notes by Willem Moors. Generated on momo:/home/willem/sync/20151223_datamungingninja/pythonbook at 2019-07-31 19:22