In [12]:
import numpy as np

In [13]:
A = np.array([ [1,2,3], [4,5,6],[7,8,9],[10,11,12] ])

In [14]:
A


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

In [15]:
A.shape


Out[15]:
(4, 3)

In [16]:
A[0,:]


Out[16]:
array([1, 2, 3])

In [17]:
A[0:1,:]


Out[17]:
array([[1, 2, 3]])

In [18]:
A[0:2,:]


Out[18]:
array([[1, 2, 3],
       [4, 5, 6]])

In [21]:
A[:,0:2]


Out[21]:
array([[ 1,  2],
       [ 4,  5],
       [ 7,  8],
       [10, 11]])

In [23]:
A[:,[2]]


Out[23]:
array([[ 3],
       [ 6],
       [ 9],
       [12]])

In [26]:
A[1,2]=9
A


Out[26]:
array([[ 1,  2,  3],
       [ 4,  5,  9],
       [ 7,  8,  9],
       [10, 11, 12]])

In [28]:
# Extracting rows and columns by criteria
A[A[:,2] == 9]


Out[28]:
array([[4, 5, 9],
       [7, 8, 9]])

In [33]:
# Converting row to column vectors
b = np.array([1,2,3])
b2 = b[np.newaxis].T
b2


Out[33]:
array([[1],
       [2],
       [3]])

In [34]:
total_elements = A.shape[0] * A.shape[1]
B = A.reshape(1, total_elements) 
# or A.reshape(1,9) # Alternative: A.shape = (1,9) # to change the array in place
B


Out[34]:
array([[ 1,  2,  3,  4,  5,  9,  7,  8,  9, 10, 11, 12]])

In [37]:
# Concatenating matrices
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[7, 8, 9],[10,11,12]])
C = np.concatenate((A, B), axis=0)
C


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

In [38]:
# Concatenating matrices
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[7, 8, 9],[10,11,12]])
C = np.concatenate((A, B), axis=1)
C


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

In [40]:
# Stacking vectors and matrices
a = np.array([1,2,3])
b = np.array([4,5,6])
np.c_[a,b]


Out[40]:
array([[1, 4],
       [2, 5],
       [3, 6]])

In [41]:
a = np.array([1,2,3])
b = np.array([4,5,6])
np.r_[a,b]


Out[41]:
array([1, 2, 3, 4, 5, 6])

In [42]:
# Creating a random m x n matrix
np.random.rand(3,2)


Out[42]:
array([[ 0.26312293,  0.12290806],
       [ 0.65438952,  0.07779357],
       [ 0.83200699,  0.46083052]])

In [43]:
# Creating a zero m x n matrix 
np.zeros((3,2))


Out[43]:
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

In [45]:
# Creating an m x n matrix of ones
np.ones((3,2),)


Out[45]:
array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])

In [48]:
# Creating an identity matrix
np.eye(3)


Out[48]:
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

In [49]:
# Creating a diagonal matrix
a = np.array([1,2,3])
np.diag(a)


Out[49]:
array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])

In [51]:
# Matrix-scalar operations
A = np.array([ [1,2,3], [4,5,6], [7,8,9] ])
# A + 2; A - 2; A / 2
A * 2


Out[51]:
array([[ 2,  4,  6],
       [ 8, 10, 12],
       [14, 16, 18]])

In [52]:
# Matrix-matrix multiplication
A = np.array([ [1,2,3], [4,5,6], [7,8,9] ])
np.dot(A,A) # or A.dot(A)


Out[52]:
array([[ 30,  36,  42],
       [ 66,  81,  96],
       [102, 126, 150]])

In [54]:
# Matrix-vector multiplication
A = np.array([ [1,2,3], [4,5,6], [7,8,9] ])
B = np.array([ [1], [4], [7] ])
np.dot(A,B) # or A.dot(B)


Out[54]:
array([[ 30],
       [ 66],
       [102]])

In [62]:
# Element-wise matrix-matrix operations
A = np.array([ [1,2,3], [4,5,6], [7,8,9] ])
# A * A
# A + A
# A - A
A / A


Out[62]:
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])

In [64]:
# Matrix elements to power n
A = np.array([ [1,2,3], [4,5,6], [7,8,9] ])
np.power(A,3)


Out[64]:
array([[  1,   8,  27],
       [ 64, 125, 216],
       [343, 512, 729]])

In [71]:
# Matrix to power n (matrix-matrix multiplication with itself)
A = np.array([ [1,2,3], [4,5,6], [7,8,9] ])
np.linalg.matrix_power(A,5)


Out[71]:
array([[121824, 149688, 177552],
       [275886, 338985, 402084],
       [429948, 528282, 626616]])

In [72]:
# Matrix transpose
A = np.array([ [1,2,3], [4,5,6], [7,8,9] ])
A.T


Out[72]:
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])

In [73]:
# Determinant of a matrix: A -> |A|
A = np.array([[6,1,1],[4,-2,5],[2,8,7]])
np.linalg.det(A)


Out[73]:
-306.0

In [77]:
# Inverse of a matrix
A = np.array([[4, 7], [2, 6]])
I = np.eye(3)
A_inverse = np.linalg.inv(A)
# A * A^-1 should yield the Identity matrix
assert(np.dot(A, A_inverse).all() == I.all())
A_inverse


Out[77]:
array([[ 0.6, -0.7],
       [-0.2,  0.4]])

In [82]:
from IPython.display import HTML
HTML('<iframe src=http://zh.wikipedia.org/wiki/%E5%8D%8F%E6%96%B9%E5%B7%AE width=1000 height=350></iframe>')


Out[82]:

In [83]:
HTML('<iframe src=http://zh.wikipedia.org/wiki/%E5%8D%8F%E6%96%B9%E5%B7%AE%E7%9F%A9%E9%98%B5 width=1000 height=350></iframe>')


Out[83]:

In [78]:
# Calculating a covariance matrix of 3 random variables (here: covariances of the means of x1, x2, and x3)
x1 = np.array([ 4, 4.2, 3.9, 4.3, 4.1])
x2 = np.array([ 2, 2.1, 2, 2.1, 2.2])
x3 = np.array([ 0.6, 0.59, 0.58, 0.62, 0.63])
np.cov([x1, x2, x3])


Out[78]:
array([[ 0.025  ,  0.0075 ,  0.00175],
       [ 0.0075 ,  0.007  ,  0.00135],
       [ 0.00175,  0.00135,  0.00043]])

In [84]:
HTML('<iframe src=http://zh.wikipedia.org/wiki/%E6%96%B9%E5%B7%AE width=1000 height=350></iframe>')


Out[84]:

In [87]:
np.cov([x1,x1])[0,0]


Out[87]:
0.025000000000000001

In [94]:
# Calculating eigenvectors and eigenvalues
HTML('<iframe src=http://zh.wikipedia.org/wiki/%E7%89%B9%E5%BE%81%E5%90%91%E9%87%8F width=1000 height=350></iframe>')


Out[94]:

In [89]:
A = np.array([[3, 1], [1, 3]])
eig_val, eig_vec = np.linalg.eig(A)
eig_val


Out[89]:
array([ 4.,  2.])

In [90]:
eig_vec


Out[90]:
array([[ 0.70710678, -0.70710678],
       [ 0.70710678,  0.70710678]])

In [92]:
# Generating a Gaussion dataset: creating random vectors from the multivariate normal distribution given mean and covariance matrix(here: 
# 5 random vectors with mean 0, covariance = 0, variance = 2)
mean = np.array([0,0])
cov = np.array([[2,0],[0,2]])
np.random.multivariate_normal(mean, cov, 5)


Out[92]:
array([[-1.40688264, -0.8842502 ],
       [ 1.50550904, -2.75120339],
       [ 2.27103454,  0.53266772],
       [ 0.32908165, -1.10694747],
       [ 1.36614367, -2.65745029]])