numpy

In this session we are going to use 2 modules:


In [1]:
import numpy as np
import timeit

Exercise

Use lists to calculate: $\vec{a}.\vec{b}$


In [29]:
n = 1000000
a = [0.1 for i in range(n)]
b = [0.1 for i in range(n)]

def dot_python(a,b):
    c = 0
    for i in range(n):
        c += a[i]*b[i]
    return c

Now let see how long does it take:


In [32]:
number = 100

time_dot_python = timeit.timeit('dot_python(a,b)', "from __main__ import dot_python,a,b,n", number=number)
print(time_dot_python)


7.302181483944878

arrays


In [ ]:
np.array([1,2,3,4])

1D 2D and more


In [ ]:
np.array([[1,2],[3,4]])

shape


In [ ]:
a = np.array([1,2,3,4])
print(a.shape)
a = np.array([[1,2,1,1],[3,4,1,1],[5,6,1,1], [5,6,1,1]])
print(a.shape)
print(a.shape[0])

Indexing and slicing, : and ::, copy


In [ ]:
print(a[1])
print(a[1,2])
print(a[:,1])
print(a[1,:])

a[:,1] = 0
print(a)
print(a[1:3,:])
a[::2,::2]=-1
print(a)
b = a.copy()
print(b)
b[:,:]=0
print(a)

flatten, ravel, reshape


In [ ]:
a.flatten()
a.ravel()

In [ ]:
a = np.array(range(24))
print(a)
a = a.reshape((3,4,2))
print(a)

np.newaxis


In [ ]:
a[:,:,:, np.newaxis].shape

zeros, ones, zeros_like, ones_like


In [ ]:
print(np.zeros((3,3)))
print(np.ones((3,3)))
print(np.zeros_like(a))
print(np.ones_like(a))

In [ ]:
a = np.ones(10)
b = np.ones(10)

In [ ]:
a

In [ ]:
a + b

In [ ]:
a * b

In [ ]:
3.0 * a

In [29]:
t = np.float128
a = np.ones(n, dtype=t)*0.1
b = np.ones(n, dtype=t)*0.1

time_dot_np = timeit.timeit('dot(a,b)', 
                            "from __main__ import a,b,n; from numpy import dot", 
                            number=number)
print(time_dot_np)


0.2075950598809868

16 0.6729173711501062 32 0.14058489305898547 64 0.15339889819733799 128 0.2075950598809868


In [36]:
time_dot_python/time_dot_np


Out[36]:
70.29305113796653

In [ ]:
a = np.ones((100,100))
b = np.ones((100,100))

a * b

In [6]:
a.dot(b)


Out[6]:
10000.000000171856

Boolian indexing


In [9]:
a = np.arange(0,1,0.1)
print(a)


[ 0.   0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9]

In [10]:
a>0.5


Out[10]:
array([False, False, False, False, False, False,  True,  True,  True,  True], dtype=bool)

In [11]:
a[a>0.5]


Out[11]:
array([ 0.6,  0.7,  0.8,  0.9])

Data types


In [15]:
np.arange(0,0.3,0.1, dtype=np.float16)


Out[15]:
array([ 0.        ,  0.09997559,  0.19995117], dtype=float16)

In [17]:
np.arange(0,0.5,0.1, dtype=np.float32)


Out[17]:
array([ 0.        ,  0.1       ,  0.2       ,  0.30000001,  0.40000001], dtype=float32)

In [19]:
np.arange(0,1,0.1, dtype=np.float64)


Out[19]:
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])

In [20]:
np.arange(0,1,0.1, dtype=np.float128)


Out[20]:
array([ 0.0,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9], dtype=float128)

In [ ]:

inf and nan


In [30]:
a = np.array([0.0, 1.0, 0.0])
b = np.array([0.0, 0.0, 1.0])

In [32]:
c = a/b


/home/hamed/py3/lib/python3.4/site-packages/ipykernel/__main__.py:1: RuntimeWarning: divide by zero encountered in true_divide
  if __name__ == '__main__':
/home/hamed/py3/lib/python3.4/site-packages/ipykernel/__main__.py:1: RuntimeWarning: invalid value encountered in true_divide
  if __name__ == '__main__':

In [33]:
c * 0


/home/hamed/py3/lib/python3.4/site-packages/ipykernel/__main__.py:1: RuntimeWarning: invalid value encountered in multiply
  if __name__ == '__main__':
Out[33]:
array([ nan,  nan,   0.])

In [34]:
print(c)
print(1/c)


[ nan  inf   0.]
[ nan   0.  inf]
/home/hamed/py3/lib/python3.4/site-packages/ipykernel/__main__.py:2: RuntimeWarning: divide by zero encountered in true_divide
  from ipykernel import kernelapp as app

In [35]:
np.inf>3


Out[35]:
True

random


In [36]:
np.random.random((10,10))


Out[36]:
array([[ 0.7833888 ,  0.09039313,  0.43060384,  0.71241538,  0.40435106,
         0.34076619,  0.20154959,  0.30506215,  0.27796376,  0.68254275],
       [ 0.29553203,  0.96157366,  0.05893016,  0.05030573,  0.66847051,
         0.03781025,  0.79110213,  0.3683985 ,  0.38908883,  0.4975336 ],
       [ 0.79582002,  0.71679702,  0.75692546,  0.06291377,  0.11551194,
         0.63278311,  0.98968971,  0.80091729,  0.85957836,  0.67854558],
       [ 0.47178347,  0.61634796,  0.15104392,  0.13306895,  0.24286895,
         0.59462112,  0.40496932,  0.33194748,  0.13486517,  0.40865995],
       [ 0.45324434,  0.21302457,  0.80780127,  0.08429001,  0.80031115,
         0.16424847,  0.73663705,  0.99719123,  0.88204953,  0.16936192],
       [ 0.80516725,  0.2017777 ,  0.46220468,  0.71473717,  0.83554267,
         0.55394249,  0.80078105,  0.64951311,  0.57955002,  0.60369391],
       [ 0.28703571,  0.47756399,  0.72764817,  0.4217118 ,  0.76762984,
         0.80530183,  0.41814592,  0.19372566,  0.3141716 ,  0.70900239],
       [ 0.71335755,  0.29553427,  0.88996702,  0.23062885,  0.31076281,
         0.09050479,  0.56051649,  0.05094393,  0.18090309,  0.80164122],
       [ 0.95279269,  0.47389827,  0.78458478,  0.1965684 ,  0.02030371,
         0.60243714,  0.65364229,  0.04778547,  0.41071141,  0.82222424],
       [ 0.91096649,  0.09649725,  0.18211157,  0.95899385,  0.07464451,
         0.58755763,  0.11158898,  0.66094112,  0.33100559,  0.58320653]])