In [234]:
import numpy as np
In [235]:
### Creating ndarrays
In [236]:
data = {i : np.random.randn() for i in range(6)}
In [237]:
data
Out[237]:
In [238]:
data2 = [[1,2,3,4],[1,4,9,16]]
In [239]:
arr2 = np.array(data2)
In [240]:
arr2
Out[240]:
In [241]:
print(arr2)
In [242]:
arr2.ndim
Out[242]:
In [243]:
arr2.shape
Out[243]:
In [244]:
arr2.dtype
Out[244]:
In [245]:
a = np.zeros(10)
In [246]:
a
Out[246]:
In [247]:
b = np.ones(10)
In [248]:
b
Out[248]:
In [249]:
a1 = np.zeros((3, 6))
In [250]:
a1
Out[250]:
In [251]:
c = np.empty((2, 3, 2))
In [252]:
c
Out[252]:
In [253]:
c.dtype
Out[253]:
In [254]:
d = np.arange(15)
In [255]:
d
Out[255]:
In [256]:
e = np.ones_like(c)
In [257]:
e
Out[257]:
In [258]:
f = np.eye(10)
In [259]:
f
Out[259]:
In [260]:
### Data Types for ndarrays
In [261]:
array1 = np.array([1, 2, 3, 4], dtype = np.float64)
In [262]:
array2 = np.array([1, 2, 3, 4], dtype = np.int32)
In [263]:
array1.dtype
Out[263]:
In [264]:
array2.dtype
Out[264]:
In [265]:
arr_string = np.array(['1.32','6.87','5.0'], dtype = np.string_)
In [266]:
arr_float = arr_string.astype(np.float64)
In [267]:
arr_float
Out[267]:
In [268]:
### Operations between Arrays and Scalars
In [269]:
arr = np.array([[1., 2. ,3.], [4., 5., 6.]], dtype=float)
In [270]:
arr
Out[270]:
In [271]:
arr*arr
Out[271]:
In [272]:
arr-arr
Out[272]:
In [273]:
1/arr
Out[273]:
In [274]:
arr**0.5
Out[274]:
In [275]:
### Basic Indexing and Slicing
In [276]:
arr = np.arange(15)
In [277]:
arr[3:8]
Out[277]:
In [278]:
'''
An important first distinction from lists is that array slices are views on the original array. This means that
the data is not copied, and any modifications to the view will be reflected in the source array
'''
Out[278]:
In [279]:
slice = arr[3:8]
In [280]:
slice[2] = 112
In [281]:
arr
Out[281]:
In [282]:
slice[3:6] = 12
In [283]:
arr
Out[283]:
In [284]:
### If you want a copy of a slice of an ndarray instead of a view, you will need to explicitly copy the array
In [285]:
array = np.arange(15)
In [286]:
slice = array[3:8].copy()
In [287]:
slice[:] = 12
In [288]:
slice
Out[288]:
In [289]:
array
Out[289]:
In [290]:
### higher dimensional arrays
In [291]:
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
In [292]:
arr2d[2][1]
Out[292]:
In [293]:
arr2d[2,1]
Out[293]:
In [294]:
arr2d[1, :2]
Out[294]:
In [295]:
arr2d[1, :2].shape
Out[295]:
In [296]:
arr2d[1:2, :2]
Out[296]:
In [297]:
arr2d[1:2, :2].shape
Out[297]:
In [298]:
arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
In [299]:
arr3d[0]
Out[299]:
In [300]:
arr3d[0,1]
Out[300]:
In [301]:
arr3d[0,1,0]
Out[301]:
In [302]:
old_values = arr3d[0].copy()
In [303]:
old_values
Out[303]:
In [304]:
arr3d[0] = 42
In [305]:
arr3d
Out[305]:
In [306]:
arr3d[0] = old_values
In [307]:
arr3d
Out[307]:
In [308]:
arr2d
Out[308]:
In [309]:
arr2d[:2]
Out[309]:
In [310]:
arr2d[:2,:2]
Out[310]:
In [311]:
### Boolean Indexing
In [312]:
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
In [313]:
data = np.random.randn(7,4)
In [314]:
data
Out[314]:
In [315]:
names == 'Bob'
Out[315]:
In [316]:
data[names == 'Bob']
Out[316]:
In [317]:
data[names == 'Bob', 2:]
Out[317]:
In [318]:
data[names == 'Bob', 2]
Out[318]:
In [319]:
data[names != 'Bob']
Out[319]:
In [320]:
data[~(names == 'Bob')]
Out[320]:
In [321]:
data[(names == 'Bob') | (names == 'Will')]
Out[321]:
In [322]:
data[data < 0] = 0
In [323]:
data
Out[323]:
In [324]:
data[names != 'Joe'] = 7
In [325]:
data
Out[325]:
In [326]:
### Fancy Indexing
In [327]:
arr = np.empty((8, 4))
In [328]:
arr
Out[328]:
In [329]:
for i in range(8):
arr[i] = i
In [330]:
arr
Out[330]:
In [331]:
arr[[4, 3, 2, 5]]
Out[331]:
In [332]:
arr[[-3, -5, -7]]
Out[332]:
In [333]:
arr = np.arange(32).reshape(8, 4)
In [334]:
arr
Out[334]:
In [335]:
arr[[1, 5, 7, 2], [0, 3, 1, 2]]
Out[335]:
In [336]:
arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
Out[336]:
In [337]:
arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])]
Out[337]:
In [338]:
np.ix_([1, 5, 7, 2], [0, 3, 1, 2])
Out[338]:
In [339]:
### Transposing Arrays and Swapping Axes
In [340]:
arr = np.arange(15).reshape((3,5))
In [341]:
arr
Out[341]:
In [342]:
arr.T
Out[342]:
In [343]:
np.dot(arr.T, arr)
Out[343]:
In [344]:
np.dot(arr, arr.T)
Out[344]:
In [345]:
arr = np.arange(16).reshape(2, 2, 4)
In [346]:
arr
Out[346]:
In [347]:
arr.transpose(1, 0, 2)
Out[347]:
In [348]:
arr.swapaxes(1, 2)
Out[348]:
In [349]:
arr
Out[349]:
In [350]:
### Universal Functions: Fast Element-wise Array Functions
In [351]:
arr = np.arange(10)
In [352]:
np.sqrt(arr)
Out[352]:
In [353]:
np.exp(arr)
Out[353]:
In [360]:
x, y = np.random.randn(8), np.random.randn(8)
In [361]:
np.maximum(x, y)
Out[361]:
In [364]:
arr = np.random.randn(7)*5
arr
Out[364]:
In [365]:
np.modf(arr)
Out[365]:
In [367]:
np.floor(arr)
Out[367]:
In [368]:
np.ceil(arr)
Out[368]:
In [369]:
np.rint(arr)
Out[369]:
In [370]:
np.isnan(arr)
Out[370]:
In [372]:
a, b = np.arange(10), np.arange(10,20)
a, b
Out[372]:
In [373]:
np.multiply(a, b)
Out[373]:
In [ ]:
In [ ]:
In [ ]: