[Indently 5 Great Numpy Features](https://www.youtube.com/watch?v=mfC7RtUQTLc) ## Broadcasting ```py import numpy as np arr = np.array([1,2,3]) print(arr+10) print(arr+[1,2,4]) arr = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr) print(arr+10) print(arr+[1,2,4]) # adds [1,2,4] to each row arr = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr) print(arr.transpose()+[1,2,4]) print((arr.transpose()+[1,2,4]).transpose()) # adds [1,2,4] to each column ``` In general, a scalar operation applied to a numpy array applies that scalar operation to each element of the array. ## Masking ```py import numpy as np arr = np.array([1,5,7,2,9,10]) mask = arr > 5 print(arr[mask]) arr[arr > 5] = 0 mask = arr % 2 == 0 print(arr[mask]) ``` ## Where ```py arr = np.array([5,10,15,20,-5,2]) result = np.where(arr > 10, "High", "Low") # [ low low high high low low ] counter = Counter(result.tolist()) for k,v in counter.items: print(f'{k}: {v}') ``` ## Funky Indexing ```py arr = np.array([10,20,30,40,50,60,70]) indices = [0,2,4,5] print(arr[indices]) print(arr[[0,2,4,5]]) arr[1:4] = [999,999,999] arr[[1,3,5]] = 1 ``` ## Clip ```py pixels = np.array([100,180,260,-20,90,300]) clipped = np.clip(pixels,0, 255) ```