numpy通過ndArray對象實現高效數組操作,提升計算速度。其核心包括:1. 創建數組的方法有np.array()、np.zeros()、np.ones()、np.empty()、np.arange()、np.linspace()及隨機函數;2. 索引和切片支持基本索引、布爾索引、花式索引等;3. 數組運算涵蓋算術、比較、邏輯運算及通用函數如np.sin()、np.exp();4. 廣播機制允許不同形狀數組運算,遵循維度數對齊、自動補1、大小匹配規則;5. 線性代數運算通過numpy.linalg模塊實現,包括矩陣求逆、行列式、特征值、解方程組等;6. 性能優化技巧包括避免循環、選擇合適數據類型、利用廣播、使用內置函數、內存視圖等。
NumPy,python科學計算的基石,本質上就是對數組進行高效操作。它簡化了向量化操作,避免了繁瑣的循環,大幅提升了計算速度。掌握NumPy,你就能更輕松地駕馭數據分析、機器學習等任務。
NumPy的核心在于ndarray對象,也就是多維數組。理解它的創建、索引、切片、運算,基本上就掌握了NumPy的精髓。
創建數組:
立即學習“Python免費學習筆記(深入)”;
- np.array():從Python列表或元組創建。這是最常用的方法,靈活方便。
- np.zeros()、np.ones()、np.empty():創建指定形狀的全零、全一或未初始化數組。適合預分配內存。
- np.arange():類似于Python的range(),創建等差數組。
- np.linspace():創建指定范圍內指定數量的等間隔數組。
- np.random.rand()、np.random.randn():創建隨機數組。
索引和切片:
NumPy的索引和切片非常強大,支持多維索引、布爾索引、花式索引等。
- 基本索引:與Python列表類似,arr[0]、arr[1, 2]。
- 切片:arr[1:5]、arr[:, 1:3]。
- 布爾索引:arr[arr > 5],根據條件篩選元素。
- 花式索引:arr[[1, 3, 5]],選擇指定索引的元素。
數組運算:
NumPy支持向量化運算,即對整個數組進行運算,而無需循環。
- 算術運算:+、-、*、/、**。
- 比較運算:>、
- 邏輯運算:&、|、~。
- 通用函數(ufunc):np.sin()、np.cos()、np.exp()、np.log()。
廣播機制:
NumPy的廣播機制允許不同形狀的數組進行運算。較小的數組會自動“廣播”到較大的數組的形狀,使其兼容。理解廣播機制是高效使用NumPy的關鍵。
NumPy數組和Python列表的區別?
Python列表可以存儲不同類型的數據,而NumPy數組只能存儲相同類型的數據。NumPy數組在內存中是連續存儲的,而Python列表不是。這使得NumPy數組的運算速度遠快于Python列表。另外,NumPy提供了豐富的數學函數和線性代數運算,而Python列表沒有。
NumPy數組的形狀(shape)和維度(ndim)有什么區別?
形狀表示數組的每個維度的大小,例如(3, 4)表示一個3行4列的二維數組。維度表示數組的軸數,例如二維數組的維度是2。你可以使用arr.shape和arr.ndim來獲取數組的形狀和維度。
如何改變NumPy數組的形狀?
可以使用np.reshape()函數改變數組的形狀。例如,arr.reshape((2, 6))將一個12個元素的數組變成一個2行6列的數組。注意,新的形狀必須與數組的元素個數匹配。另外,np.flatten()可以將多維數組展平成一維數組。
NumPy的廣播機制是如何工作的?
廣播機制允許不同形狀的數組進行運算。它遵循以下規則:
- 如果兩個數組的維度數不同,則維度數較小的數組會在其形狀的前面補1,直到維度數相同。
- 如果兩個數組的形狀在任何一個維度上都不匹配,并且其中一個數組在該維度上的大小為1,則該數組會在該維度上進行廣播,使其大小與另一個數組匹配。
- 如果在任何一個維度上,兩個數組的大小都既不相等,也不有一個等于1,則會引發ValueError。
掌握了這些規則,你就能更好地理解和利用廣播機制。
如何使用NumPy進行線性代數運算?
NumPy提供了numpy.linalg模塊,用于進行線性代數運算。
- np.linalg.inv():求矩陣的逆。
- np.linalg.det():求矩陣的行列式。
- np.linalg.eig():求矩陣的特征值和特征向量。
- np.linalg.solve():求解線性方程組。
- np.dot():矩陣乘法。
這些函數可以幫助你進行各種線性代數計算。
NumPy的性能優化技巧有哪些?
- 避免循環:盡量使用向量化運算,避免使用Python循環。
- 選擇合適的數據類型:使用dtype參數指定合適的數據類型,減少內存占用和計算時間。
- 利用廣播機制:合理利用廣播機制,避免不必要的內存復制。
- 使用NumPy的內置函數:NumPy的內置函數經過優化,性能通常優于手寫的Python代碼。
- 使用內存視圖:使用切片創建數組的內存視圖,避免復制數據。
合理應用這些技巧,可以顯著提升NumPy代碼的性能。