python進階(資料分析numpy庫 二)
2、ndarray陣列的切片:
(1)陣列切片的基本知識
各個維度上單獨切片,用 “,” 隔開,用 “:”表示該維度所有的值。
陣列切片獲得的 新陣列與原資料組共用一個 記憶體空間,切片陣列更改資料原陣列也會更改。
ndarray 的切片與列表方式切片有一些區別,儘量用陣列方式。
import numpy as np
list1 = [
[ [1,2,3],
[3,2,1]],
[ [4,5,6],
[6,5,4]],
[ [7,8,9],
[9,8,7]]]
arr1 = np.array(list1)
(一)陣列切片與列表方式切片的區別:
print(arr1[1,:,1:3])
陣列切片:
[[5 6]
[5 4]]
print(arr1[1][:][1:3])
列表方式:
[[6 5 4]]
(二)陣列切片用法:
切第二行的元素 print(arr1[1,:,:]) print(arr1[1]) print(arr1[1,:,1:3]) [[5 6] [5 4]]
(2)切片陣列賦值列表或陣列:
賦值列表
import numpy as np
arr1 = np.random.randint(1,9,(3,4))
arr1[:,::2] = [100,100]
print(arr1)
[[100 6 100 2]
[100 6 100 1]
[100 3 100 5]]
賦值陣列 import numpy as np arr1 = np.random.randint(1,9,(3,12)) arr1[:,::2] = np.array([100,100,100,100,100,100]) print(arr1) [[100 4 100 3 100 5 100 7 100 8 100 8] [100 2 100 1 100 3 100 8 100 3 100 1] [100 6 100 1 100 1 100 6 100 8 100 2]]
(3)花式索引:用整數陣列進行索引。
注意 內部函式 .ix_( 索引陣列1,索引陣列2 ) 的用法。
也可用轉置( .T )來取與 .ix_()方法一樣的結果。
import numpy as np
arr1 = np.arange(1,31,1).reshape(6,5)
print(arr1)
# 獲得第 2 4 5 行的所有元素
print(arr1[[1,3,4]])
# 注意這裡取的是 (1,1) (3,2) (4,4) 四個元素
print(arr1[[1,3,4],[1,2,4]])
# 取得時是所有 第 2 4 5 行 與 1,2,4列的元素。 用 內部函式 np.ix_( 索引陣列1,索引陣列2 )
print(arr1[np.ix_([1,3,4],[1,2,4])])
# 也可以用轉置 來取,與 np.ix_( )結果相同。
print(arr1[[1,3,4]].T[[1,2,4]].T)
(4)bool值陣列索引:
利用布林型別的陣列進行資料索引,最終返回的結果是對應索引陣列中資料為True位置的值。
例項用法:
①
求陣列 數 > 5 的所有數。
import numpy as np
arr1 = np.arange(1,11,1).reshape(2,5)
# [[ 1 2 3 4 5]
# [ 6 7 8 9 10]]
print(arr1 > 5)
# [[False False False False False]
# [ True True True True True]]
print(arr1[arr1 > 5])
# [ 6 7 8 9 10]
②
names = np.array(['joe','tom','anne'])
scores = np.array([[70,80,90],
[77,88,91],
[80,90,70]])
classes = np.array(['語文','數學','英語'])
# 輸出 joe 的成績
bool_1 = names == 'joe'
print(bool_1) [ True False False]
print(scores[bool_1]) # [[70 80 90]]
# 輸出joe的數學成績
bool_2 = classes == '數學'
print(bool_2) [False True False]
print(scores[bool_1,bool_2]) # [80]
# 第三題
print(scores[(names == 'joe')|(names == 'anne')])
# [[70 80 90]
# [80 90 70]]
#第四題
print(scores[(names != 'joe') & (names != 'anne')]) # [[77 88 91]]
3、ndarray-陣列轉置與軸對換:
注意陣列轉置與 reshape()的區別。
陣列轉置的基本概念:
陣列轉置是指將shape進行重置操作,原始的shape值為:(2,3,4),轉置後shape的值為:(4,3,2)。可以通過呼叫陣列的 物件.transpose( ) 函式或者 物件.T 屬性進行陣列轉置操作。
① 陣列的轉置:
import numpy as np
arr1 = np.arange(1,11,1).reshape(2,5)
1、 利用 T 屬性
arr2 = arr1.T
print(arr2)
2、利用 transpose()函式
arr3 = arr1.transpose()
print(arr3)
② 陣列的軸對換:
import numpy as np
arr1 = np.arange(1,13,1).reshape(2,3,2)
arr2 = arr1.transpose(2,0,1) 中間不用加小()
print(arr2)
[[[ 1 3 5]
[ 7 9 11]]
[[ 2 4 6]
[ 8 10 12]]]
執行過程:
4、ndarray-陣列拉伸與合併:
①陣列的拉伸:np.tile(A,rep),可以將陣列A進行拉伸,沿著A的維度重複rep次
例子:
import numpy as np
arr1 = np.array([[1,2,3],
[4,5,6]])
print(np.tile(arr1,3)) # 一個數字為 橫向拉伸 3 倍
print(np.tile(arr1,(3,1))) # 縱向 拉伸 3倍 ,橫向拉伸 1倍
② 陣列的合併:np.stack()函式
對於ndarray陣列而言,多個數組可以執行合併操作,合併的方式有多種:
- Stack(arrays,axis=0):沿著新的軸加入一個維度 ( axis是座標軸 ,stack 堆 )
- vstack():堆疊陣列垂直順序(行)
- hstack():堆疊陣列水平順序(列)。
- stack()函式內部要加 小 ()。
-
import numpy as np a = np.array([[1,2,3], [4,5,6]]) b = np.array([[1,2,3], [4,5,6]]) c = np.array([[1,2,3], [4,5,6]]) d = np.array([[1,2,3], [4,5,6]]) e = np.array([1,2,3]) f = np.array([4,5,6]) print(np.stack((e,))) # 注意 : stack 裡面要用小()括起來,預設 axis 為 0 軸。 print(np.stack((e,),axis=1)) print(np.stack((e,f),axis=1))
5、ndarray-通用函式/常用函式:(元素級運算)
ufunc:接受一個或多個標量值,進行快速元素級運算的函式,主要包括一元函式和二元函式。
①一元 ufunc:元素級操作,呼叫方法: np . 函式名()。
例子:
② 二元ufunc :(元素級操作,其中dot 不是元素級操作)
陣列的 點積 不同於 陣列 * 陣列 。
6、聚合函式:
arr1 =np.random.randint(1,11,(3,4))
print(np.max(arr1)) # 求最大值
print(np.min(arr1))
print(np.mean(arr1)) # 平均值
print(arr1.mean()) # 平均值
方差:np.array( ) 、標準差:np.std( )
聚合函式對 某一軸元素進行 聚合:
7、np. where()函式(三元表示式x if condition else y效果):
np.where(condition,arr1,arr2) 滿足條件 選擇arr1,不滿足 選擇arr2
用法:
8、去重函式 np.unique(物件):