利用python進行資料分析(第二版)筆記
Numpy
1、建立ndarray物件
1、arr.ndim:Numpy陣列維度資訊
2、arr.shape:Numpy陣列形狀資訊
3、np.empty並不能保證返回所有是0的陣列,某些情況下,會返回初始化時的垃圾數值
2、型別轉換
1、float變為int,小數點後的部分會被丟棄
2、可以用astype把string裡的數字變為實際的數字
*3、astype函式總是會返回一個新的陣列
3、陣列計算
1、任何兩個大小相等的陣列之間的運算,都是element-wise(點對點)
arr = np.array([[1., 2., 3.], [4., 5., 6.]]) array([[1., 2., 3.], [ 4., 5., 6.]]) arr * arr array([[ 1., 4., 9.], [ 16., 25., 36.]])
2、如果涉及標量(scalar)的話,會涉及到陣列的每一個元素
1 / arr array([[ 1. , 0.5 , 0.33333333], [ 0.25 , 0.2 , 0.16666667]]) arr ** 0.5 array([[ 1. , 1.41421356, 1.73205081], [2. , 2.23606798, 2.44948974]])
arr2 > arr
array([[False, True, False], [ True, False, True]], dtype=bool)
4、索引和切片
arr = np.arange(10) arr array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) arr[5:8] = 12 arr array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
*1、把12賦給arr[5:8]
,其實用到了broadcasted(廣播、廣式變換)
*2、python內建的list與numpy的array有個明顯的區別,這裡array的切片後的結果只是一個views(檢視),用來代表原有array對應的元素,而不是建立了一個新的array。但list裡的切片是產生了一個新的list
*3、如果想要複製,可以使用copy()方法,比如arr[5:8].copy()
4、nump索引和切片的順序是按shape所列出的順序進行索引和切片的
5、使用布林索引對行進行索引
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe']) names array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4') data = np.random.randn(7, 4) data array([[ 0.85947145, -2.49437476, 1.25012184, 1.27752535], [-0.4937663 , 0.66665867, 1.42447218, -0.13281765], [ 0.37139927, -0.8753652 , 1.40390804, 0.61556806], [ 0.33419279, -0.45132649, -0.20364103, 0.3050267 ], [-0.06436347, 0.04273151, -0.47264989, 2.02201285], [-1.50137347, -0.62250184, -0.85898857, -0.33666096], [ 0.75711807, 0.05412138, -0.4199252 , 0.42394965]]) data[names == 'Bob'] array([[ 0.85947145, -2.49437476, 1.25012184, 1.27752535], [ 0.33419279, -0.45132649, -0.20364103, 0.3050267 ]])
6、使用布林索引對列進行索引
data[names == 'Bob', 2:] array([[ 1.25012184, 1.27752535], [-0.20364103, 0.3050267 ]])
7、可以使用!=
或者~表示非
8、組合多個布林條件,用布林運算子&、|,python中的關鍵詞and和or不管用
9、使用比較符號對資料進行篩選
data[data < 0] = 0 data array([[ 0.85947145, 0. , 1.25012184, 1.27752535], [ 0. , 0.66665867, 1.42447218, 0. ], [ 0.37139927, 0. , 1.40390804, 0.61556806], [ 0.33419279, 0. , 0. , 0.3050267 ], [ 0. , 0.04273151, 0. , 2.02201285], [ 0. , 0. , 0. , 0. ], [ 0.75711807, 0.05412138, 0. , 0.42394965]])
5、花式索引
1、按一定順序選出幾行,可以用一個整數list或整數ndarray來指定順序
arr = np.empty((8, 4)) for i in range(8): arr[i] = i arr array([[ 0., 0., 0., 0.], [ 1., 1., 1., 1.], [ 2., 2., 2., 2.], [ 3., 3., 3., 3.], [ 4., 4., 4., 4.], [ 5., 5., 5., 5.], [ 6., 6., 6., 6.], [ 7., 7., 7., 7.]]) arr[[4, 3, 0, 6]] array([[ 4., 4., 4., 4.], [ 3., 3., 3., 3.], [ 0., 0., 0., 0.], [ 6., 6., 6., 6.]]) arr[[-3, -5, -7]] array([[ 5., 5., 5., 5.], [ 3., 3., 3., 3.], [ 1., 1., 1., 1.]])
2、選出指定位置元素
arr = np.arange(32).reshape((8, 4)) arr array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23], [24, 25, 26, 27], [28, 29, 30, 31]]) arr[[1, 5, 7, 2], [0, 3, 1, 2]] array([ 4, 23, 29, 10])
[ 4, 23, 29, 10]
分別對應(1, 0), (5, 3), (7, 1), (2, 2)
3、選取區域元素
arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]] array([[ 4, 7, 5, 6], [20, 23, 21, 22], [28, 31, 29, 30], [ 8, 11, 9, 10]])
4、先從arr中選出[1, 5, 7, 2]這四行,然後[:, [0, 3, 1, 2]]表示選中所有行,但是列的順序要按0,3,1,2來排
6、陣列轉置和軸交換
1、轉置也是返回一個view,而不是新建一個數組。有兩種方式,一個是transpose方法,一個是T屬性
arr = np.arange(8).reshape((4, 2)) print(arr.T) print(arr) [[0 2 4 6] [1 3 5 7]] [[0 1] [2 3] [4 5] [6 7]]
2、對於多維陣列,transpose會接受由軸數字組成的tuple,來交換軸
arr = np.arange(16).reshape((2, 2, 4)) arr array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]]) arr.transpose((1, 0, 2)) array([[[ 0, 1, 2, 3], [ 8, 9, 10, 11]], [[ 4, 5, 6, 7], [12, 13, 14, 15]]])
3、darray有個方法叫做swapaxes, 這個方法取兩個axis值,並交換這兩個軸
arr array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]]) arr.swapaxes(1, 2) # 直交換second axis和last axis array([[[ 0, 4], [ 1, 5], [ 2, 6], [ 3, 7]], [[ 8, 12], [ 9, 13], [10, 14], [11, 15]]])
swapaxes也是返回view,不生成新的data
本文參考來源:
https://github.com/BrambleXu/pydata-notebook