還記得自己剛接觸Pandas、Sklearn、Tensorflow這幾個技術的時候,經常看到文檔和代碼中針對多維數組的創建、變形、乘法等操作,因為不了解這些知識導致難以理解進度緩慢,後來才知道它們都是在依賴Numpy這個庫。
後來我發現,如果想學好Pandas和Sklearn/Tensorflow這些數據分析、機器學習/深度學習的技術,Numpy是一定要系統性的學習的。
本文總結下Numpy的一些重要的知識內容:
Numpy的介紹Numpy是什麼Python的一個開源的數值計算擴展庫,用來存儲和處理多維矩陣Numpy的用途高性能的實現二維或多維數組的處理和計算作為pandas、scikit-learn、tensorflow等基礎依賴庫Numpy的基礎結構一維數組、二維數組Numpy的核心數據結構數組的屬性數組的維度:shape元組數組的維度數目:ndim數組全部元素的個數:size數組的元素類型:dtype構造數組從Python的列表List和嵌套列表創建array:x = np.array([1,2,3,4,5,6,7,8])便捷函數:arange、ones/ones_like、zeros/zeros_like、empty/empty_like、full/full_like隨機數組0~1之間均勻分布:rand(d0, d1, …, dn)均值0方差1的標準分布:randn(d0, d1, …, dn)隨機整數:randint(low[, high, size)0~1之間隨機數:random([size])從數組a中隨機抽取結果:choice(a[, size, replace, p])對數組x隨機打散:shuffle(x)實現數組全排列:permutation(x)按均值loc方差scale生成的高斯分布數組:normal([loc, scale, size])生成low和high之間均勻分布的數字:uniform([low, high, size])結構化數組用於表達各列類型不同的異構數據:np.dtype([('name', 'U10'), ('age', 'i4'), ('weight', 'f8')])可以用列表切片的方式查詢行:my_arr[0:2]用字典的方式查詢列:my_arr['age']按條件做篩選:my_arr[my_arr["age"] >= 29]對異構數據的操作一般用pandas更容易處理數組的操作數據查詢基礎索引:X[:2, 2:4]神奇索引:x[[3,4,7]]布爾索引:x[x>5]怎樣增加一個維度arr[np.newaxis, :]np.expand_dims(arr, axis=0)np.reshape(arr, (1, 5))數組的合併沿著指定axis進行數組的合併:np.concatenate(array_list, axis=0/1)垂直vertically、按行row wise進行數據合併:np.vstack或者np.row_stack(array_list)水平horizontally、按列column wise進行數據合併:np.hstack或者np.column_stack(array_list)數組的乘法*符號或者np.multiply:逐元素乘法,對應位置的元素相乘,要求shape相同@符號或者np.matmul:矩陣乘法,形狀要求滿足(n,k),(k,m)->(n,m)數組的排序numpy.sort:返回排序後數組的拷貝array.sort:原地排序數組而不是返回拷貝numpy.argsort:間接排序,返回的是排序後的數字索引數據統計np.sum:所有元素的和np.prod:所有元素的乘積np.cumsum:元素的累積加和np.cumprod:元素的累積乘積np.min:最小值np.max:最大值np.percentile:0-100百分位數np.quantile:0-1分位數np.median:中位數np.average:加權平均,參數可以指定weightsnp.mean:平均值np.std:標準差np.var:方差廣播的概念規則1:如果兩個數組的維度數dim不相同,那麼小維度數組的形狀將會在左邊補1規則2:如果shape的維度不匹配,但是有維度是1,那麼可以擴展維度是1的維度匹配另一個數組;規則3:如果shape的維度不匹配,但是沒有任何一個維度是1,則匹配失敗引發錯誤;Numpy數組讀寫到文件np.load(filename):從.npy或者.npz文件中加載numpy數組np.save(filename, arr):將單個numpy數組保存到.npy文件中np.savez(filename, arra=arra, arrb=arrb):將多個numpy數組保存到.npz未壓縮的文件格式中np.savez_compressed(filename, arra=arra, arrb=arrb):將多個numpy數組保存到.npz壓縮的文件格式中線性代數包求解逆矩陣B = np.linalg.inv(A)SVD矩陣分解U, S, V = np.linalg.svd(A, full_matrices=False)求解線性方程組x = np.linalg.solve(A, b)多項式擬合params = np.polyfit(x, y, 10)與其它庫的關係Numpy與Matplotlib的關係曲線圖:plt.plot(x, y)柱狀圖:plt.bar(labels, arr)餅圖:plt.pie(arr, labels=labels, autopct='%1.1f%%')直方圖:plt.hist(arr, bins=100, density=1)Numpy與Pandas的關係構造Series:series = pd.Series(arr)構造DataFrame:df = pd.DataFrame(arr, columns = ["ca", "cb", "cc", "cd"])Series轉Numpy:series.values、series.to_numpy()DataFrame轉Numpy:df.values、df.to_numpy()Numpy與Scikit-learn的關係數據集是Numpy:data, target = datasets.load_boston(return_X_y=True)拆分訓練集和測試集:X_train, X_test, y_train, y_test = train_test_split(data, target)訓練模型:clf.fit(X_train, y_train)模型打分:clf.score(X_test, y_test)模型預估:clf.predict(X_test[:3])
另外,對於Numpy技術的講解我自己錄製成了22集的視頻課程:
視頻全集地址在愛奇藝搜索「numpy」就能找到我
或者點下方「閱讀原文」可以跳轉到視頻全集