1. 程式人生 > >18-09-21 numpy 的基礎學習01

18-09-21 numpy 的基礎學習01

# 1關於numpy 的學習

import numpy as np

# 一 如何建立陣列****

# 1 有規律的一維資料的建立======
# 1 range() 和arange() 區別 貌似沒有區別
lst1 = range(10)
lst1 = list(lst1)
# print(lst1,type(lst1)) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>

lst2 = np.arange(10)
lst2 = list(lst2)
# print(lst2,type(lst2)) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>

# 2 利用array()函式建立無規律的一維陣列 array 一維陣列的建立(元素由元祖 或者列表) ======

arr1 = np.array((1,20,13,28,22))
arr2 = np.array([1,20,13,28,22])
# print("arr1",arr1,type(arr1)) #arr1 [ 1 20 13 28 22] <class 'numpy.ndarray'> ndarray:多維陣列
# print("arr2",arr2,type(arr2)) #arr1 [ 1 20 13 28 22] <class 'numpy.ndarray'> ndarray:多維陣列

# 3 二維資料的建立========
# array 二維陣列的建立(元素由元祖套元祖 或者列表套列表) #大列表套小列表


arr4 = np.array(((1,2,3),(4,5,6),(7,8,9)))
# print("arr4=",arr4,type(arr4))
# arr4= [[1 2 3]
# [4 5 6]
# [7 8 9]] <class 'numpy.ndarray'>

arr5 = np.array([[1,2,3],[4,5,6],[7,8,9]])
# print("arr5=",arr5,type(arr5))

# arr5= [[1 2 3]
# [4 5 6]
# [7 8 9]] <class 'numpy.ndarray'>

# 4 特殊陣列的建立

# 4-1 zeros 方式 不能巢狀

arr6 = np.zeros(5) #返回一維元素全為0的陣列
# for i in arr6:
# print(i)
# print("arr6",arr6,type(arr6)) #arr6 [0. 0. 0. 0. 0.] <class 'numpy.ndarray'>

arr7 = np.zeros((2,5)) #返回一維元素全為0 的2x5 的二維陣列
# for i in arr7:
# print(i)
# print("arr7",arr7,type(arr7))
# arr7 [[0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0.]] <class 'numpy.ndarray'>

arr8 = np.zeros([3,6]) #返回元素全為0 的 3x6的資料
# print("arr8",arr8,type(arr8)) #arr7 [[0. 0.]] <class 'numpy.ndarray'>

# arr8 [[0. 0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0. 0.]] <class 'numpy.ndarray'>


# 4-2 empty 的方式 個人感覺和zeros 有點相似
arr9 = np.empty(3) #返回一維空陣列
# print("arr9=",arr9,type(arr9)) #arr9= [0. 0. 0.] <class 'numpy.ndarray'>

arr10 = np.empty([3,4]) # 返回3x4的二維空陣列
# print("arr10",arr10,type(arr10))
# arr10 [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]] <class 'numpy.ndarray'>


# 二 有關資料的屬性和函式****

# 1 shape 方法返回陣列的行數 和列數
arr11 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr11 = arr11.shape #shape 方法返回陣列的行數 和列數
#print(arr11) #(3, 3) #3行3列

# 2#dtype 方法返回陣列的資料型別 int32
arr12 = np.array([[1,2,3],[4,5,6],[7,8,9]])
# arr12 = arr12.dtype #dtype 方法返回陣列的資料型別 int32
#print(arr12)

# 3-1通過ravel的方法將陣列拉直(多維資料降為一維資料)
arr13 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr13 = arr13.ravel()# 通過ravel的方法將陣列拉直(多維資料降為一維資料)
# print(arr13) #[1 2 3 4 5 6 7 8 9]
# print(list(arr13)) #[1, 2, 3, 4, 5, 6, 7, 8, 9]

# 3-2通過flatten 的方法將陣列拉直
arr14 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr14 = arr14.flatten()#通過flatten 的方法將陣列拉直
# print(arr14) #[1 2 3 4 5 6 7 8 9]

# 注意:雖然ravel() 和flatten() 都是將陣列拉直,
# 區別:1 racelI() 的方法生成的是原陣列的檢視,無需找有記憶體空間,但是陣列的變化會影響到原陣列的變化
# 2 flatten() 的方法返回的是真實的值 其值得改變並不會影響到原陣列的變化

# 3-3 舉例說明區別拉直是否改變原生陣列 flatten不變 ravel 變化
arr15 = np.array([[1,2,3],[4,5,6],[7,8,9]])
_arr15 = arr15.flatten() #原陣列不變
_arr15[:3] = 0
# print(arr15)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]

arr16 = np.array([[1,2,3],[4,5,6],[7,8,9]])
_arr16 = arr16.ravel()# 原陣列會隨之變化
_arr16[0:3] = 0
# print(arr16)
# [[0 0 0]
# [4 5 6]
# [7 8 9]]

#4返回陣列的維數ndim 自己的理解就是巢狀幾層
arr17 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr17 = arr17.ndim
# print(arr17) #2

# 5 返回陣列元素的個數 size
arr18 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr18 = arr18.size
# print(arr18) #9

# 6 返回陣列的轉置結果 類似zip型別(將原始的列,變成每行 )
arr19 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr19 = arr19.zip
# print(arr19)
# [[1 4 7]
# [2 5 8]
# [3 6 9]]

# 瞭解複數 z=a+bi(a,b均為實數)的數稱為複數,其中a稱為實部,b稱為虛部,i稱為虛數單位
# 7 如果陣列的資料型別為複數的話,real方法可以返回複數的實部,imag 方法返回複數的虛部
# 返回陣列有多少行,

# 8 長度引數 len()
arr20 = np.array([[1,2,3],[4,5,6],[7,8,9]])
l = len(arr20)
# print(l) #3

# 8 hstack()或者column_stack() 在列數一定情況下 橫向拼接 在每一行後邊就追加
arr21 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr22 = np.array([[10,20],[40,50],[70,80]])
# arr23 = np.hstack((arr21,arr22))
arr23 = np.column_stack((arr21,arr22)) #一樣的效果
# print(arr23)

# [[ 1 2 3 10 20]
# [ 4 5 6 40 50]
# [ 7 8 9 70 80]]


# 9 vstack()或者row_stack() 在行數一定的情況下 縱向拼接
arr24 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr25 = np.array([[10,20,30],[40,50,60]])
arr26 = np.vstack((arr24,arr25))
# arr26 = np.row_stack((arr24,arr25))#拼接列 一樣的效果
# print(arr26)

# [[ 1 2 3]
# [ 4 5 6]
# [ 7 8 9]
# [10 20 30]
# [40 50 60]]


# 10 reshape() 函式 將一維陣列設定為二維陣列,且3行6列
# resize() 函式可以重新設定陣列的行數 和列數

arr27 = np.array(np.arange(18))
# print(arr27) #[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]
arr27 = arr27.reshape(3,6)
# print(arr27)
# [[ 0 1 2 3 4 5]
# [ 6 7 8 9 10 11]
# [12 13 14 15 16 17]]
# ???????? resize() 略 會直接改變元祖的形狀


# 11 tolist 將陣列轉換成列表,astype() 強制轉換成陣列的資料型別,

arr28 = np.array([[1,2,3],[4,5,6],[7,8,9]])
_arr28 = arr28.tolist()
# print(arr28,_arr28)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]]


arr29 = arr28.astype(float)
# print(_arr28,"==",arr29,type(arr29))
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# ==
# [[1. 2. 3.]
# [4. 5. 6.]
# [7. 8. 9.]] <class 'numpy.ndarray'>

# 12 陣列元素的獲取==很重要

## 12-1 一維陣列元素的獲取與列表 通過切片取值 ,元祖的獲取方式一樣 ,通過索引和切片的方式獲取陣列元素,
arr30 = np.array(np.arange(10))
#print(arr30)


# print("取值第6個元素",arr30[5])# 5
# print("取值前3個元素",arr30[:3])# [0 1 2]
# print("取值第4個元素及之後的元素",arr30[4:]) #[4 5 6 7 8 9]
# print("取值最後的2元素",arr30[8:9]) #[8]
# print("取值從1開始步長為3的元素",arr30[::3]) #[0 3 6 9]

# 12-2 二維陣列元素的獲取
arr31 = np.array(np.arange(12).reshape(3,4)) #三行四列
# print(arr31)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]

# print("返回陣列的第2行",arr31[1]) #返回陣列的第2行 [4 5 6 7]
# print("返回陣列的前2行",arr31[:2]) #返回陣列的前2行 [[0 1 2 3][4 5 6 7]]
# print("返回陣列的第1行和第3行",arr31[::2])
# print("返回陣列的第1行和第3行",arr31[[0,2]])#注意裡面套裝兩個[] 擷取的是0 第一 和2 第3 行資料
# 返回陣列的第1行和第3行 [[ 0 1 2 3]
# [ 8 9 10 11]]


# ==========關於列的返回值 不理解??????
# print("返回陣列的第1列",arr31[:,0]) #返回陣列的第1列 [0 4 8] #0 代表第一列
# print("返回陣列的後2列",arr31[:,-2:]) # -2代表後2列=====????
# 返回陣列的後2列
# [[ 2 3]
# [ 6 7]
# [10 11]]
# print("返回陣列的第1列和第3列",arr31[:,[0,2]])
# 返回陣列的第1列和第3列
# [[ 0 2]
# [ 4 6]
# [ 8 10]]

# print(arr31[1,2]) #返回的是第二行第三列的資料
# 6

# 12-3 布林索引 即索引值為 True 和 Fales 需要注意的是布林索引必須輸陣列物件。

# 1選出所有的True 物件
log = np.array([False,False,False,True,True,True])#此處相當於6行,必須和陣列對應好行數
arr32 = np.array(np.arange(12).reshape(6,2)) #對比以上的6行,前三行是False 後三行是True 顯示後三行
# print(arr32)
# print(arr32[log])
# [[ 6 7]
# [ 8 9]
# [10 11]]

# 2 選出所有的False 物件

# print(arr32[-log]) #?????? 出錯了 不知道為什麼出錯?????????


# 場景示例 查詢相關的行(以下註解:一共7行,過濾是A的資料)

area = np.array(["A","B","A","C","A","B","D"])
# print(area) #['A' 'B' 'A' 'C' 'A' 'B' 'D']

arr33 = np.array(np.arange(21).reshape(7,3))
# print(arr33)

# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]
# [12 13 14]
# [15 16 17]
# [18 19 20]]

# print(arr33[area == "A"]) #一維陣列 每個元素看成一行,元素A 的1 3 5 行
# [[ 0 1 2]
# [ 6 7 8]
# [12 13 14]]

# print(arr33[(area == "A") | (area == "C")]) #注意大小寫 該是什麼就是什麼

# [[ 0 1 2]
# [ 6 7 8]
# [ 9 10 11]
# [12 13 14]]

# 布林索引也可以與普通索引或切片混合使用
# 擷取 A行 的第1列和第3 列

# print(arr33[area == 'A'][:,[0,2]]) #第1列和第3列

# [[ 0 2]
# [ 6 8]
# [12 14]]
# 花式索引 按照指定順序返回對應的行

# print(arr33[[3,0,5]]) # 注意裡面是個陣列的形式 按照索引取值每行

# [[ 9 10 11]
# [ 0 1 2]
# [15 16 17]

# 花式索引 按照指定順序返回對應的行過濾出的列

# print(arr33[[3,0,5]][:,[0,2]]) #按照以上得出的結果 再取列 第1列和第3列

# [[ 9 11]
# [ 0 2]
# [15 17]]

# 如果想使用比較簡單的方式返回指定行以列的二維陣列的話,可以使用ix_() 函式

a = arr33[np.ix_([3,0,5],[0,2])] #和以上 [[3,0,5]][:,[0,2]]) 一樣的
# print(a)
# [[ 9 11]
# [ 0 2]
# [15 17]]


# 12-4 統計函式與線性代數運算
# 統計運算中常見的聚合函式有:最小值、最大值、中位數、均值、方差、標準差等。首先來看看陣列元素級別的計算:
####=== 1 取值範圍 數字——np
arr34 = 5-np.arange(1,13).reshape(4,3) #一共12個數字 從+4開始到-7 [-7:5]
# print(arr34)
# [[ 4 3 2]
# [ 1 0 -1]
# [-2 -3 -4]
# [-5 -6 -7]]

#### ===2 隨機數 整數 random
arr35 = np.random.randint(1,10,size = 12).reshape(4,3)
# print(arr35)
# [[6 5 8]
# [8 6 1]
# [2 5 8]
# [6 7 3]]

#### ===3 計算每個元素的平方 **2

a = arr34 ** 2
# print(a)

# [[16 9 4]
# [ 1 0 1]
# [ 4 9 16]
# [25 36 49]]

#### ===4 計算每個元素的平方根 sqrt()
arr36 = np.arange(4,7).reshape(1,3)
# print(arr36)
# [[4 5 6]]
a = np.sqrt(arr36)
# print(a)
# [[2. 2.23606798 2.44948974]]
# 由於負值的平方根沒有意義,故返回nan。

#### ===5 計算每個元素的自然對數值 log()

# print(np.log(arr36))
# [[1.38629436 1.60943791 1.79175947]]

#### ===6 計算每個元素的絕對值 abs()

arr37 = 5-np.arange(1,13).reshape(3,4)
# print(arr37)
# [[ 4 3 2 1]
# [ 0 -1 -2 -3]
# [-4 -5 -6 -7]]
arr38 = np.abs(arr37)
# print(arr38)

# [[4 3 2 1]
# [0 1 2 3]
# [4 5 6 7]]
# print(arr38.tolist()) #[[4, 3, 2, 1], [0, 1, 2, 3], [4, 5, 6, 7]]

# 7 相同形狀陣列之間元素的操作========
# 相同形狀陣列之間元素的操作 相加
# print(arr37 + arr38)
# [[8 6 4 2]
# [0 0 0 0]
# [0 0 0 0]]

# 相同形狀陣列之間元素的操作 相減
# print(arr37 - arr38)

# [[ 0 0 0 0]
# [ 0 -2 -4 -6]
# [ -8 -10 -12 -14]]


# 相同形狀陣列之間元素的操作 相乘
# print(arr37 * arr38)

# [[ 16 9 4 1]
# [ 0 -1 -4 -9]
# [-16 -25 -36 -49]]

# 相同形狀陣列之間元素的操作 相除
# print(arr38 / arr37)

# [[ 1. 1. 1. 1.]
# [nan -1. -1. -1.]
# [-1. -1. -1. -1.]]


# 相同形狀陣列之間元素的操作 整除
# print(arr38 // arr37)

# [[ 1 1 1 1]
# print(arr38 // arr37)
# [ 0 -1 -1 -1]
# [-1 -1 -1 -1]]

# 相同形狀陣列之間元素的操作 取餘
# print(arr37 % arr38)

# [0 0 0 0]
# print(arr37 % arr38)
# [0 0 0 0]]



# ===== 12-5 統計運算函式

arr39 = 5-np.arange(1,13).reshape(3,4)
# print(arr39)
# [[ 4 3 2 1]
# [ 0 -1 -2 -3]
# [-4 -5 -6 -7]]

# 1計算所有元素的和 sum
# print(np.sum(arr39)) #-18

#2 對每一列求和
# print(np.sum(arr39,axis=0))
# [ 0 -3 -6 -9]

# 3 對每一行求和
# print(np.sum(arr39,axis=1))
# [ 10 -6 -22]

#4 對每一個元素求累計和(從上到下,從左到右)
# print(np.cumsum(arr39))
# [ 4 7 9 10 10 9 7 4 0 -5 -11 -18]

# 5 求每一列的累積和 返回個二維陣列
# print(np.cumsum(arr39,axis=0))
# [[ 4 3 2 1]
# [ 4 2 0 -2]
# [ 0 -3 -6 -9]]

# 6 求每一行的累計和 返回個二維陣列
# print(np.cumprod(arr39,axis=1))
# [[ 4 12 24 24]
# [ 0 0 0 0]
# [ -4 20 -120 840]]

# 7 計算所有元素的最小值
# print(np.min(arr39)) #-7

# 8 計算所有元素的最大值
# print(np.max(arr39))

# 9 計算每一列的最大值
# print(np.max(arr39,axis=0)) #
# [[ 4 3 2 1]

# 10計算所有元素的平均值
# print(np.mean(arr39)) #-1.5

# 11 計算每一行的均值
# print(np.mean(arr39,axis=1))
# #[ 2.5 -1.5 -5.5]

# 12 計算所有元素的中位數
# print(np.median(arr39)) #-1.5

# 13 計算每一列的中位數
# print(np.median(arr39,axis=0))
#[ 0. -1. -2. -3.]

# 14 計算所有元素的方差
# print(np.var(arr39))
# 11.916666666666666

# 15 計算每一行的標準差
# print(np.std(arr39,axis=1))
# [1.11803399 1.11803399 1.11803399]


# numpy中的統計函式運算是非常靈活的,既可以計算所有元素的統計值,也可以計算指定行或列的統計指標。還有其他常用的函式,如符號函式sign,ceil( >= x的最小整數),floor( <= x的最大整數),modf(
# 將浮點數的整數部分與小數部分分別存入兩個獨立的陣列),cos,arccos,sin,arcsin,tan,arctan等。

# 一個函式是where(),它類似於Excel中的if函式,可以進行靈活的變換:

arr40 = 5-np.arange(1,13).reshape(3,4)
# print(arr40)
# [[ 4 3 2 1]
# [ 0 -1 -2 -3]
# [-4 -5 -6 -7]]

arr41 = np.where(arr40<0,"negtive","positive") #negtive 否定的 positive 正數
# print(arr41)
# [['positive' 'positive' 'positive' 'positive']
# ['positive' 'negtive' 'negtive' 'negtive']
# ['negtive' 'negtive' 'negtive' 'negtive']]


# 13-======其他函式

# unique(x):計算x的唯一元素,並返回有序結果
#
# intersect(x,y):計算x和y的公共元素,即交集
#
# union1d(x,y):計算x和y的並集
#
# setdiff1d(x,y):計算x和y的差集,即元素在x中,不在y中
#
# setxor1d(x,y):計算集合的對稱差,即存在於一個數組中,但不同時存在於兩個陣列中
#
# in1d(x,y):判斷x的元素是否包含於y中