In [1]:
import numpy as np
In [16]:
a = np.array( [1, 2, 3, 4, 5], float)
a
Out[16]:
In [21]:
b = np.array( [9,8,9], int)
print b.dtype
In [29]:
print a[2:]
print a[-1]
print a[2:4]
a[0] = 5
print a
In [30]:
for elem in a:
print elem
In [243]:
A = np.array( [[1,2,3], [4,5,6], [7,8,9]])
A
Out[243]:
In [251]:
print A[0,0]
print A[2,:]
print A[:,0]
print
print A[::1,1]
In [264]:
a = np.array( range(15) )
print a[1:10:2]
a[1::2] = 0
print a
In [44]:
print len(A) # length of 1st dimension
print A.shape # shape of the arrays
In [47]:
print 2 in A
print 13 in A
In [53]:
c = np.array([1,2,3,4,5,6])
print c
c.reshape( (3,2) ) # reshape takes a dimension tuple as input (#rows,#cols)
Out[53]:
In [64]:
a = np.array([1,2,3])
b = a
c = a.copy()
a[0]=6
print a
print b
print c
In [72]:
# convert to python list
a.tolist()
# fill up with new value
a.fill(12)
print A
print A.transpose() # transpose matrix
print A.T # same as A.transpose()
In [77]:
# concatenate arrays
B = A.transpose()
np.concatenate( (A,B) )
np.concatenate( (A,B), axis=1 )
Out[77]:
In [81]:
# equally spaced values within an interval: arange( start, stop, step )
np.arange(0, 5, 0.1)
Out[81]:
In [84]:
# generate 1 or 0-arrays
print np.ones( (2,3) )
print np.zeros( (3,4) )
In [85]:
# construct an array with a similar shape to another one
np.zeros_like(A)
Out[85]:
In [86]:
# identity matrix
Id = np.identity(4)
Id
Out[86]:
In [265]:
A = np.array([[1,2],[3,4]])
B = np.array([[0,1],[1,0]])
A + B
A - B
A * B
B / A
A ** B
Out[265]:
In [111]:
A = np.ones( (3,3) )
c = np.array([1,2,3])
# per default arrays are added row-wise
A + c
# like this col-wise
A + c[:,np.newaxis]
Out[111]:
In [129]:
# element-wise functions
np.sqrt(a) # square root
np.sign(a) # sign
np.log(a) # natural logarithm
np.log10(a) # decadic logarithm
np.exp(a) #exponential
np.sin(a) # trigonometric (also cos, tan, arcsin, arccos, arctan)
# non-element-wise
a.sum() # sum of all elements
a.prod() # product of all elements
a.mean() # mean
a.var() # variance
a.std() # standard deviation
a.max() # maximum
a.min() # minimum
a.sort()
np.unique( [1,1,3,3,5] ) # get unique elements
Out[129]:
In [134]:
A = np.array( [[0,1], [1,0]] )
v = np.array( [6,7] )
np.dot( A,v ) # matrix product
Out[134]:
In [141]:
np.linalg.det(A) # determinant
np.linalg.eig(A) # eigenvalues and eigenvectors
np.linalg.inv(A) # matrix inverse
np.linalg.svd(A) # singular value decomposition
Out[141]:
In [152]:
a = np.array( [1,6,3,4,9,6,7,3,2,4,5] )
a[ a>4 ] # get all elements larger than 4
a[ np.logical_and(a>4, a<12) ]
# acessing via index
indices = [1,3]
a[indices]
Out[152]:
Scipy is a collection of useful scientific algorithms
In [159]:
import scipy as sp
import scipy.optimize
In [180]:
from matplotlib import pyplot as plt
plt.style.use('ggplot')
%matplotlib inline
In [188]:
# define a function
def myfunc( x ):
return ( 3 + x ) * (3 - x) * -12
# minimize using scipy
sp.optimize.minimize_scalar( myfunc )
Out[188]:
In [190]:
# plot the function
x = np.arange( -100, 100, 1 )
plt.plot(x, myfunc(x) )
Out[190]:
Consider a growing bacterial population with a doubling time of 2 hours
this means that the growth rate is $$ k_g = \frac {ln( 2 )} {2} = 0.34657359027997264 $$
and the growth model: $$ \frac {dx} {dt} = k_g \cdot x $$
lets integrate this ODE using scipy.integrate.odeint
In [234]:
import scipy.integrate
k_g = math.log(2)/2
x0 = 1e-5
time = np.arange(0,10,1)
def dxdt( x, t ):
return k_g * x
result = scipy.integrate.odeint(dxdt, x0, time )
plt.plot( time, result)
Out[234]:
In [235]:
exact = x0 * np.exp( k_g*time )
exact - result.T
plt.plot( time, (exact - result.T).T )
Out[235]: