Numpy庫學習
來自專欄 Python程序員
最近在學習科學計算相關的Python庫,因此先來整理一下Numpy這個最基本的庫。
下面是首先導入numpy和matplotlib庫import numpy as npimport matplotlib.pyplot as plt
Numpy中包含ndarray和matrix兩個對象,而其中ndarray又是非常常用的多維數組對象。
1、創建ndarray數組
data = np.array([[2,4,5,6],[2,3,1,3]])data
array([[2, 4, 5, 6], [2, 3, 1, 3]])
能夠創建ndarray的np函數有array(),arrang(),linespace(),ones(),zeros()
data2 = np.linspace(1,20,20)data2
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15., 16., 17., 18., 19., 20.])
2 、ndarray的一些參數
data.dtype,data.shape,data.ndim
(dtype(int32), (2, 4), 2)
data.shape
(2, 4)
data.ndim
2
3、索引和切片
data[:,2:3],data[0:2,[1,2]]
(array([[5], [1]]), array([[4, 5], [3, 1]]))
data[0:2,[1,2]]
array([[4, 5], [3, 1]])
直接索引和切片是比較簡單的查找數據的方式,通過這種方式得到的仍然是ndarray對象,並且是原對象的淺拷貝,如果需要深拷貝建立副本的話使用copy()函數即可。索引中有一種比較重要又難以理解的的方式,布爾型索引。
names = np.array([zhou,li,wang,zhang])names == zhou
array([ True, False, False, False], dtype=bool)
data[:,names == zhou]
array([[2], [2]])
data[data > 2] = -1data
array([[ 2, -1, -1, -1], [ 2, -1, 1, -1]])
總結:基本上索引方式都可以認為是索引時傳給數組一個行號的數組,一個列號的數組從而實現索引。
4、數組的一些操作
通常對數組來說有reshape(),transpose()來進行數組形狀的改變。
除此之外還有一些元素級別的操作例如abs(),add()等,這兩個部分較為簡單。
利用np.where進行一些判斷邏輯操作np.where(con,x,y)arr = np.random.randn(3,4)arr
array([[ 0.43902481, -0.71598515, -0.29229109, 1.47960366], [-0.41818462, -0.51393751, -0.13377322, -1.4436627 ], [ 0.18593743, 1.15210741, -0.67014517, 2.2018497 ]])
np.where(arr>0,2,-2)
array([[ 2, -2, -2, 2], [-2, -2, -2, -2], [ 2, 2, -2, 2]])
此外,還有一些數據統計的函數例如sum,sort,mean,可以計算出總體或者某行某列的數值。
arr.sort(axis = 1)arr
array([[-0.71598515, -0.29229109, 0.43902481, 1.47960366], [-1.4436627 , -0.51393751, -0.41818462, -0.13377322], [-0.67014517, 0.18593743, 1.15210741, 2.2018497 ]])
names = np.append(names,zhou)np.unique(names)
array([li, wang, zhang, zhou], dtype=<U5)
5、線性代數和隨機數
numpy中的線性代數操作主要是包含在linalg這個模塊中,我用的比較少,可能會用到的就是dot,inv,qr
而隨機數就相對來說比較有用,可以主要掌握以下幾個模塊。np.random.rand(2,4) # 產生0~1的隨機數
array([[ 0.26970185, 0.40492813, 0.17614584, 0.54370365], [ 0.03209999, 0.28651036, 0.74425983, 0.02604322]])
np.random.randn(2,4) # 產生標準正態分布(0,1)
array([[-1.27238813, 0.25136539, -1.68008268, -1.28196789], [ 0.38298877, -0.35651327, 0.54964306, 0.98343527]])
np.random.randint(1,10) # 上下限範圍內隨機整數
3
6、矩陣相關
matrix的意義在於使矩陣操作更加像matlab中的操作,這樣既簡單又容易移植。但是這裡存在的問題是經常會跟ndarray混淆,所以最好只使用ndarray。但是使用ndarray又有一些很不舒服的地方,比如對一維數組的矩陣相乘就很麻煩。但是我們只需要記住一個結論,當兩個數組shape表示的形式靠近的數相同時,才能相乘。例如:(10,10 * 1) ,(10,10),(1 * 10,10)
矩陣點乘 np.dot(x,y)a = np.array([0,1,3,4]) #注意這是一維的a,a.ndim
(array([0, 1, 3, 4]), 1)
#使用這樣的數組最好進行轉置b = np.random.rand(4,3)a.dot(b)
array([ 4.68473789, 6.85917889, 5.20869666])
還有一點要注意的就是數組的維度,使用reshape來轉換時,reshape(裡面加元組變成多維變數,加整數為一維變數)
推薦閱讀:
※課程資源 | Python語言系列專題MOOC
※【翻譯】《利用Python進行數據分析·第2版》第3章(下)Python的數據結構、函數和文件
※利用Python進行數據分析——繪圖和可視化(八)(1)
※python如何定義坐標?
※pandas可視化(1)【官方文檔解讀】--基礎繪圖