In [9]:
# Basic NP arrays
import numpy as np

my_list1 = [1,2,3,4]

my_array1 = np.array(my_list1)
my_array1


Out[9]:
array([1, 2, 3, 4])

In [2]:
my_list2 = [11,22,33,44]
my_lists = [my_list1,my_list2]
my_array2 = np.array(my_lists)
my_array2


Out[2]:
array([[ 1,  2,  3,  4],
       [11, 22, 33, 44]])

In [3]:
my_array2.shape


Out[3]:
(2, 4)

In [4]:
my_array2.dtype


Out[4]:
dtype('int64')

In [5]:
np.zeros(5)


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

In [6]:
np.eye(5)


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

In [7]:
np.arange(5,50,2)


Out[7]:
array([ 5,  7,  9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37,
       39, 41, 43, 45, 47, 49])

In [11]:
# Scalars and Arrays
arr1 = np.array([[1,2,3,4],[8,9,10,11]])
arr1


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

In [12]:
arr1*arr1


Out[12]:
array([[  1,   4,   9,  16],
       [ 64,  81, 100, 121]])

In [13]:
arr1-arr1


Out[13]:
array([[0, 0, 0, 0],
       [0, 0, 0, 0]])

In [14]:
1/arr1


Out[14]:
array([[ 1.        ,  0.5       ,  0.33333333,  0.25      ],
       [ 0.125     ,  0.11111111,  0.1       ,  0.09090909]])

In [15]:
arr1 ** 3


Out[15]:
array([[   1,    8,   27,   64],
       [ 512,  729, 1000, 1331]])

In [16]:
# Indexing Arrays
arr = np.arange(0,11)
arr


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

In [17]:
arr[1:5]


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

In [18]:
arr[0:5]


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

In [19]:
arr[0:5] = 100

In [20]:
arr


Out[20]:
array([100, 100, 100, 100, 100,   5,   6,   7,   8,   9,  10])

In [22]:
slice_of_arr = arr[0:6]
slice_of_arr


Out[22]:
array([100, 100, 100, 100, 100,   5])

In [23]:
slice_of_arr[:] = 99
slice_of_arr


Out[23]:
array([99, 99, 99, 99, 99, 99])

In [27]:
# Note: Objects treated the same way as Java to save memory, need deep copies then use this
arr_copy = arr.copy()
arr_copy[:] = 88
print(arr_copy)
print(arr)


[88 88 88 88 88 88 88 88 88 88 88]
[99 99 99 99 99 99  6  7  8  9 10]

In [28]:
arr_2d = np.array(([5,10,15],[20,25,30],[35,40,45]))
arr_2d[1]


Out[28]:
array([20, 25, 30])

In [30]:
arr_2d[1][2]


Out[30]:
30

In [31]:
arr_2d[:2,1:]


Out[31]:
array([[10, 15],
       [25, 30]])

In [34]:
arr2d = np.ones((10,10))
arr2d


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

In [35]:
arr_length = arr2d.shape[1]
arr_length


Out[35]:
10

In [37]:
for i in range(arr_length):
    arr2d[i] = i
arr2d


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

In [38]:
# Fancy indexing
arr2d[[2,4,6,8]]


Out[38]:
array([[ 2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.],
       [ 4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.],
       [ 6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.],
       [ 8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.]])

In [41]:
# Array Transposition
arr = np.arange(50).reshape((10,5))
arr


Out[41]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34],
       [35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44],
       [45, 46, 47, 48, 49]])

In [42]:
arr.T


Out[42]:
array([[ 0,  5, 10, 15, 20, 25, 30, 35, 40, 45],
       [ 1,  6, 11, 16, 21, 26, 31, 36, 41, 46],
       [ 2,  7, 12, 17, 22, 27, 32, 37, 42, 47],
       [ 3,  8, 13, 18, 23, 28, 33, 38, 43, 48],
       [ 4,  9, 14, 19, 24, 29, 34, 39, 44, 49]])

In [43]:
np.dot(arr.T,arr)


Out[43]:
array([[7125, 7350, 7575, 7800, 8025],
       [7350, 7585, 7820, 8055, 8290],
       [7575, 7820, 8065, 8310, 8555],
       [7800, 8055, 8310, 8565, 8820],
       [8025, 8290, 8555, 8820, 9085]])

In [44]:
arr3d = np.arange(50).reshape((5,5,2))
arr3d


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

       [[10, 11],
        [12, 13],
        [14, 15],
        [16, 17],
        [18, 19]],

       [[20, 21],
        [22, 23],
        [24, 25],
        [26, 27],
        [28, 29]],

       [[30, 31],
        [32, 33],
        [34, 35],
        [36, 37],
        [38, 39]],

       [[40, 41],
        [42, 43],
        [44, 45],
        [46, 47],
        [48, 49]]])

In [45]:
arr3d.transpose((1,0,2))
arr3d


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

       [[10, 11],
        [12, 13],
        [14, 15],
        [16, 17],
        [18, 19]],

       [[20, 21],
        [22, 23],
        [24, 25],
        [26, 27],
        [28, 29]],

       [[30, 31],
        [32, 33],
        [34, 35],
        [36, 37],
        [38, 39]],

       [[40, 41],
        [42, 43],
        [44, 45],
        [46, 47],
        [48, 49]]])

In [46]:
arr = np.array([[1,2,3]])
arr


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

In [48]:
arr.swapaxes(0,1)


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

In [49]:
# Universal Array Functions
arr = np.arange(11)
arr


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

In [50]:
np.sqrt(arr)


Out[50]:
array([ 0.        ,  1.        ,  1.41421356,  1.73205081,  2.        ,
        2.23606798,  2.44948974,  2.64575131,  2.82842712,  3.        ,
        3.16227766])

In [51]:
np.exp(arr)


Out[51]:
array([  1.00000000e+00,   2.71828183e+00,   7.38905610e+00,
         2.00855369e+01,   5.45981500e+01,   1.48413159e+02,
         4.03428793e+02,   1.09663316e+03,   2.98095799e+03,
         8.10308393e+03,   2.20264658e+04])

In [52]:
A = np.random.randn(10)

A


Out[52]:
array([ 1.13223343, -0.57628346,  0.23046879, -0.31341985,  0.61753143,
       -0.43812641, -0.21745207, -0.58013817, -0.20731684, -1.0876597 ])

In [54]:
B = np.random.randn(10)
B


Out[54]:
array([-0.10594106, -0.85445846, -0.51948638,  0.6626617 , -1.67586268,
       -1.04126289, -1.13064664, -0.21733764,  0.47978161, -0.26860873])

In [55]:
## Binary Functions - go to scipi docs for more info about functions
np.add(A,B)


Out[55]:
array([ 1.02629236, -1.43074192, -0.28901759,  0.34924185, -1.05833125,
       -1.47938929, -1.34809872, -0.79747581,  0.27246477, -1.35626843])

In [56]:
np.maximum(A,B)


Out[56]:
array([ 1.13223343, -0.57628346,  0.23046879,  0.6626617 ,  0.61753143,
       -0.43812641, -0.21745207, -0.21733764,  0.47978161, -0.26860873])

In [57]:
# Array Processing
import matplotlib.pyplot as plt
%matplotlib inline

In [58]:
points = np.arange(-5,5,0.01)

In [59]:
dx,dy = np.meshgrid(points,points)

In [60]:
dx


Out[60]:
array([[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       ..., 
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99]])

In [61]:
dy


Out[61]:
array([[-5.  , -5.  , -5.  , ..., -5.  , -5.  , -5.  ],
       [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
       [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
       ..., 
       [ 4.97,  4.97,  4.97, ...,  4.97,  4.97,  4.97],
       [ 4.98,  4.98,  4.98, ...,  4.98,  4.98,  4.98],
       [ 4.99,  4.99,  4.99, ...,  4.99,  4.99,  4.99]])

In [62]:
z = (np.sin(dx) + np.sin(dy))
z


Out[62]:
array([[  1.91784855e+00,   1.92063718e+00,   1.92332964e+00, ...,
         -8.07710558e-03,  -5.48108704e-03,  -2.78862876e-03],
       [  1.92063718e+00,   1.92342581e+00,   1.92611827e+00, ...,
         -5.28847682e-03,  -2.69245827e-03,  -5.85087534e-14],
       [  1.92332964e+00,   1.92611827e+00,   1.92881072e+00, ...,
         -2.59601854e-03,  -5.63993297e-14,   2.69245827e-03],
       ..., 
       [ -8.07710558e-03,  -5.28847682e-03,  -2.59601854e-03, ...,
         -1.93400276e+00,  -1.93140674e+00,  -1.92871428e+00],
       [ -5.48108704e-03,  -2.69245827e-03,  -5.63993297e-14, ...,
         -1.93140674e+00,  -1.92881072e+00,  -1.92611827e+00],
       [ -2.78862876e-03,  -5.85087534e-14,   2.69245827e-03, ...,
         -1.92871428e+00,  -1.92611827e+00,  -1.92342581e+00]])

In [63]:
plt.imshow(z)


Out[63]:
<matplotlib.image.AxesImage at 0x7f40980593c8>

In [64]:
plt.imshow(z)
plt.colorbar()
plt.title('plot for sin(x) + sin(y)')


Out[64]:
<matplotlib.text.Text at 0x7f4098085470>

In [65]:
## Numpy where
A = np.array([1,2,3,4])
B = np.array([100,200,300,400])

condition = np.array([True, True, False, False])
answer = [(A_val if cond else B_val) for A_val,B_val,cond in zip(A,B,condition)]

answer


Out[65]:
[1, 2, 300, 400]

In [66]:
answer2 = np.where(condition,A,B)
answer2


Out[66]:
array([  1,   2, 300, 400])

In [67]:
from numpy.random import randn

arr = randn(5,5)
arr


Out[67]:
array([[ 0.11067203,  1.65174189, -0.37035951,  2.98132695,  1.62584685],
       [-1.43006252, -1.65509042,  0.88558483, -0.12787118,  2.63952522],
       [ 0.15758274, -0.10019225,  1.25318954,  0.88700632,  0.7955164 ],
       [ 0.07069567, -0.50942953,  0.81859015, -1.54484668, -0.42013412],
       [ 0.39693311, -1.21937456, -0.23439737, -1.41357597, -0.24848244]])

In [68]:
np.where(arr<0,0,arr)


Out[68]:
array([[ 0.11067203,  1.65174189,  0.        ,  2.98132695,  1.62584685],
       [ 0.        ,  0.        ,  0.88558483,  0.        ,  2.63952522],
       [ 0.15758274,  0.        ,  1.25318954,  0.88700632,  0.7955164 ],
       [ 0.07069567,  0.        ,  0.81859015,  0.        ,  0.        ],
       [ 0.39693311,  0.        ,  0.        ,  0.        ,  0.        ]])

In [69]:
# Awesome!!!!

In [71]:
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr.sum()


Out[71]:
45

In [72]:
arr.sum(0)


Out[72]:
array([12, 15, 18])

In [73]:
arr.mean()


Out[73]:
5.0

In [74]:
arr.std()


Out[74]:
2.5819888974716112

In [75]:
arr.var()


Out[75]:
6.666666666666667

In [76]:
bool_arr = np.array([True,False,True])
bool_arr.any()


Out[76]:
True

In [79]:
bool_arr.all()


Out[79]:
False

In [80]:
## Sort
arr = randn(5)
arr.sort()
arr


Out[80]:
array([-2.2359462 , -0.74372833, -0.71017767, -0.26157103,  0.3970143 ])

In [81]:
countries = np.array(['France','Germany','USA','France'])
np.unique(countries)


Out[81]:
array(['France', 'Germany', 'USA'], 
      dtype='<U7')

In [83]:
np.in1d(['France','Mexico'], countries)


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

In [84]:
# Array Input and Output
arr = np.arange(5)
np.save('myarray', arr)
arr = np.arange(10)
print(arr)
np.load('myarray.npy')


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

In [ ]: