程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

第二章 人工智能專題之Python進階 - Numpy庫

編輯:Python

1、numpy庫介紹

1.1、Numpy庫概述

  • 主要用於對多維數組執行計算,是一個非常高效的用於處理數值運算的包
  • 特點
    • 1、numpy底層內置了並行運算功能,當系統有多個核心時,做某種計算時,numpy會自動做並行計算
    • 2、Numpy底層使用C語言編寫,內部解除了GIL(全局解釋器鎖),對數組的操作速度不受Python解釋器的限制,效率遠高於純Python代碼。
    • 3、有一個強大的N維數組對象Array(一種類似列表的東西)
    • 4、使用的線性代數、傅裡葉變換和隨機生成函數

1.2、numpy數組和Python列表性能對比

  • 使用python列表創建隨機數
#獲取當前時間戳
t1 = time.time()
a = []
for x in range(1000000):
a.append(x**2)
t2 = time.time()
print(t2-t1)
  • 查詢結果

  • 使用numpy創建隨機數
t3 = time.time()
b = np.arange(1000000)**2
t4 = time.time()
print(t4-t3)
  • 查詢結果

1.3、數組和列表對比

  • numpy中的數組使用跟Python中的列表非常類似,區別如下
    • 1、一個列表中可以存儲多種數據類型,而數組只能存儲同種數據類型
    • 2、數組可以是多維的,當數組中的所有數據類型都是數值型的時候,相當於線性代數中的矩陣,是可以進行相互間的運算

2、數組的創建方式

  • numpy經常和數組打交道,因此第一步是要學會創建數組。在numpy中的數組的數據類型叫做ndarray

2.1、使用np.array創建(列表)

b = np.array([1,2,3,4])
print(b)
print(type(b))
  • 運行結果

2.2、使用np.arange創建 (等差序列)

arr2 = np.arange(0,10,2)
print(arr2)
print(type(arr2))
  • 運行結果

2.3、使用np.random創建(隨機數)

arr3 = np.random.random(10)
print(arr3)
print(type(arr3))
  • 運行結果

2.4、使用函數創建(特殊數)

a1 = np.zeros((2,2))
a2 = np.ones((3,2))
a3 = np.full((2,2),8) #生成一個所有元素都是8的2行2列的數組
a4 = np.eye(3) #生成一個在斜方形上元素為1,其余元素為0的3*3的矩陣
print(a1)
print(a2)
print(a3)
print(a4)
  • 運行結果

3、數組常用屬性

3.1、數組數據類型

bool,int8,int16,int32,int64,uint8,uint16,uint32,uint64
object_,string_,unicode_
  • 范例
c = np.array([1,2,3,4],dtype=np.float16)
print(c)
print(c.dtype)
  • 運行結果

3.2、數據類型轉換

  • 類型轉換:文件加載完畢後,為了減小內存空間,轉換其數據類型
import numpy as np
a1 = np.array([1,2,3])
print(a1.dtype) # windows下默認為int32
a2 = a1.astype(np.int8) #astype不會修改數組本身,二十返回修改數據結果
print(a2)
  • 查詢結果

4、多維數組

4.1、多維數組的創建

shape:查看數組維度
ndim:查看數組維度
size:查看數組元素個數
itemsize:查看數組中每個元素所占大小,單位是字節
  • 范例
a1 = np.array([1,2,3,4])
a2 = np.array([[1,2,3,4],[5,6,7,8]])
a3 = np.array([[[1,2,3,4],[1,2,3,4]],[[1,2,3,4],[1,2,3,4]]])
print(a1.shape)
print(a2.shape)
print(a3.shape)
  • 查詢結果

4.2、維度轉換

reshape:維度轉換,不會修改數組本身
resize:維度轉換,會修改數組本身
flatten:維度轉換成一維,返回原數組副本
ravel:維度轉換為一維,返回原數組引用
  • 范例一
a4 = a3.reshape((4,4))
print(a4)
print(a4.shape)
  • 查詢結果

  • 范例二
a1 = np.random.randint(0,5,size=(3,2,2))
a2 = np.random.randint(0,5,size=(2,2))
print(a1.flatten())
print("========")
print(a1)
print("========")
print(a2.ravel())
print("========")
print(a2)
print("========")
print(a1+a2)
  • 查詢結果

  • 開發常用 - 轉換成一維數組
a5 = a3.reshape((16,))
print(a5)
print(a5.shape)
  • 查詢結果

4.3、axis軸理解

  • 最外面的括號代表axis=0,依次往裡的括號對應的axis的計數依次加1

  • 操作方式:如果指定軸進行相關操作,那麼會使用該軸下的每個直接子元素分別進行相關操作

  • 范例
arr1 = np.arange(0,6).reshape(2,3)
arr2 = np.arange(6,12).reshape(2,3)
print(arr1+arr2)
  • 查詢結果

4.4、多維數組總結

1、數組一般達到三維就已經很復雜了,不太方便計算,所以我們一般都會把3維以上的數組轉換成2維數組來計算
2、ndarray.ndim:查看數組維度
3、ndarray.shape:查看數組形狀,shape是一個元組,裡面有幾個元素代表幾維數組
4、ndarray.reshape:修改數組的形狀,修改前後的元素總數必須一致
5、ndarray.size:看到數組總共元素個數
6、ndarray.itemsize:查看數組每個元素所占內存大小

5、數組的切片和索引

5.1、一維數組的切片和索引

包括:[起始位置:結束位置:步長]
  • 范例
a6 = np.arange(10)
print(a6)
print(a6[1])
print(a6[0:4])
print(a6[0:6:2])
print(a6[::-1])
  • 查詢結果

5.2、多維數組的切片和索引

多維數組:
中括號一個值:代表行
中括號兩個值:逗號分隔,都好前面是行,逗號後面是列,結果為一維數組
  • 范例
a7 = np.random.randint(0,10,size=(4,6))
print(a7)
print("============")
print(a7[1])
print("============")
print(a7[0:2])
print("============")
print(a7[[0,2,3]])
print("============")
print(a7[0:2,0])
  • 查詢結果

5.3、布爾索引

布爾索引:<,>,<=,>=,==,!=,&,|
  • 范例:將數組a7中所有小於5且大於3的數據全部提取出來
a8 = [(a7 < 5) & (a7>3)]
print(a8)
print("============")
print(a7[a8])
  • 查詢結果

  • 注意事項
布爾索引:通過相同數組上的True還是False來進行提取
提取條件多個: & 代表且, | 代表或, 每個條件都要用圓括號括起來

6、數組值的替換

6.1、索引替換

  • 范例
a7[a7 < 3] = 1
a7
  • 查詢結果

6.2、函數替換

np.where(條件,0,1)
  • 范例
result = np.where(a7 > 5 ,0,1)
result
  • 查詢結果

7、數組廣播機制

7.1、數組與常數的運算

  • 范例
a1 = np.arange(10).reshape(2,5)
print(a1)
a2 = a1 + 10
print(a2)
  • 查詢結果

7.2、數組與數組的運算

(1)相同結構運算

直接相加
  • 范例
a1 = np.arange(10).reshape(2,5)
print(a1)
print("=======")
a2 = a1 + 10
print(a2)
print("=======")
a3 = a1 + a2
print(a3)
print("=======")
  • 查詢結果

(2)不同結構運算

1、兩數組其中一方長度為1,則廣播兼容
2、兩數組從末尾開始算起的維度的軸長度相符,則廣播兼容
  • 范例一
a1 = np.random.randint(0,5,size=(3,8,2))
a2 = np.random.randint(0,5,size=(8,1))
print(a1)
print("========")
print(a2)
print("========")
print(a1+a2)
  • 查詢結果

  • 范例二
a1 = np.random.randint(0,5,size=(3,2,2))
a2 = np.random.randint(0,5,size=(2,2))
print(a1)
print("========")
print(a2)
print("========")
print(a1+a2)
  • 查詢結果

7.3、數組疊加

(1)垂直方向疊加

vstack:數組垂直方向疊加,
前提條件:數組列數必須相同
  • 范例
a1 = np.random.randint(0,5,size=(2,2))
a2 = np.random.randint(0,5,size=(2,2))
a3 = np.vstack([a1,a2])
print(a3)
  • 查詢結果

(2)水平方向疊加

hstack:將數組按水平方向疊加
前提條件:數組的行必須相同才能疊加
  • 范例
a1 = np.random.randint(0,5,size=(2,2))
a2 = np.random.randint(0,5,size=(2,2))
a3 = np.hstack([a1,a2])
print(a3)
  • 查詢結果

(3)手動指定

concatenate:將兩個數組進行疊加,具體方向看參數axis
  • 范例
a1 = np.random.randint(0,5,size=(2,2))
a2 = np.random.randint(0,5,size=(2,2))
a3 = np.concatenate([a1,a2],axis=None)
a4 = np.concatenate([a1,a2],axis=1)
a5 = np.concatenate([a1,a2],axis=0)
print(a3)
print(a4)
print(a5)
  • 查詢結果

7.4、數組切割

(1)水平切割

hsplit:水平切割
  • 范例
a1 = np.random.randint(0,5,size=(2,2))
np.hsplit(a1,2)
  • 查詢結果

(2)垂直切割

vsplit:按照垂直方向進行分割
  • 范例
a1 = np.random.randint(0,5,size=(2,2))
np.vsplit(a1,2)
  • 查詢結果

(3)指定方向

split:指定方向切割,參數axis0為行,1為列
  • 范例
a1 = np.random.randint(0,5,size=(2,2))
a2 = np.split(a1,2,axis=0)
print(a2)
a3 = np.split(a1,2,axis=1)
print(a3)
  • 查詢結果

7.5、數組轉置

轉置:矩陣內積計算
  • 范例
a1 = np.random.randint(0,5,size=(2,2))
print(a1)
print("=====")
print(a1.T)
print("=====")
print(a1.dot(a1.T))
  • 查詢結果

8、數組的深/淺拷貝

不拷貝:簡單賦值不會拷貝
淺拷貝:變量拷貝,所指向內存空間相同
深拷貝:
  • 范例
a = np.random.randint(0,5,size=(2,2))
b = a
print(b is a)
print("======")
c = a.view()
print(c is a)
c[[0],[0]] = 100
print(c)
print(a)
print("======")
d = a.copy()
d[[1],[1]] = 10
print(d)
print(a)
  • 查詢結果

9、文件操作

numpy文件格式:npy或者npz結尾

9.1、讀取文件

np.savetxt:保存文件格式,頂部標記,分隔符
  • 范例
a = np.random.randint(0,100,size=(4,4))
np.savetxt("a.csv",a,delimiter=",",header="a,b,c,d")
  • 查詢結果

9.2、文件保存

np.loadtxt:數據類型,分隔符,跳行
  • 范例
data = np.loadtxt("b.csv",delimiter=",")
data
  • 查詢結果

9.3、讀取非文本文件

np.load:讀取非文本文件格式,可用於三維數組以上
  • 范例
np.load("a.npy")
  • 查詢結果

9.4、保存非文本文件

np.save:保存非文本文件格式,可用於三維數組以上
  • 范例
a = np.random.randint(0,100,size=(4,4,4))
np.save("a.npy",a)
  • 查詢結果

9.5、寫入CSV文件

with open(文件名稱,讀,編碼方式) as 對象名稱:
reader = csv.reader(fp)
reader = csv.DictReader(fp)
  • CSV文件
CSV文件特征
:1、純文本,使用某個字符集,比如ASCII、Unicode
:2、由記錄組成
:3、每條記錄被分割符分割為字段(典型分隔符有逗號,分號,制表符)
:4、每條字段有同樣的字段序列
  • 范例 - 迭代器(列表形式)讀取文件內容
import csv
with open('b.csv','r') as fp:
#reader是一個迭代器
reader = csv.reader(fp)
#next取出第一個指針指向的數據,之後下移
titles = next(reader)
print(titles)
print("=========")
for x in reader:
print(x)
print("========")
a = x[0]
b = x[1]
print(a+b+"結果")
  • 查詢結果

  • 范例 - 迭代器(字典形式)讀取文件內容
with open("b.csv",'r') as fp:
reader = csv.DictReader(fp)
for x in reader:
print(x)
  • 查詢結果

9.6、讀取CSV文件

with open(文件名稱,寫入,編碼格式):
writer = csv.writer(fp)
writer.writerow #寫入一行
writer.writerows #寫入多行
  • 范例 - 一次性寫入多行數據
headers = {
"username","age","height"}
values = [('張三',18,200),('李四',19,180)]
with open('c.csv','w',encoding='utf-8') as fp:
writer = csv.writer(fp)
writer.writerow(headers)
writer.writerows(values)
  • 查詢結果

10、NAN和INF值處理

NAN:Not A Number,不是一個數字,屬於浮點類型
INF:Infinity,代表無窮大,除數為0時出現,也是與浮點類型
  • NAN的特點:
:1、NAN和NAN不相等,比如np.NAN 1= np.NAN這個條件是成立的
:2、NAN和任何值做運算,結果都是NAN

(1)刪除缺失值

data[~np.isnan(data)] :刪除空值,將數組轉換為一維數組
np.delete(data,np.where(np.isnan(data))[0],axis=0) :刪除為NAN的行
  • 范例 - 刪除空值,轉換為一維
import numpy as np
# 1、刪除所有NAN的值,因為刪除了值後數組不知道怎麼變化,所以會變成一維數組
data = np.random.randint(0,10,size = (3,5)).astype(np.float)
data[0:1] = np.nan
data = data[~np.isnan(data)]
print(data)
  • 查詢語句

  • 范例 - 刪除空值所在的行
import numpy as np
# 1、刪除所有NAN的值,因為刪除了值後數組不知道怎麼變化,所以會變成一維數組
data = np.random.randint(0,10,size = (3,5)).astype(np.float)
#將0,1和1,2兩個值設置為NAN
data[[0,1],[1,2]] = np.nan
#獲取那些行有NAN
lines = np.where(np.isnan(data))[0]
#使用delete方法刪除指定的行,axis = 0表示刪除,lines表示刪除的符號
data1 = np.delete(data,lines,axis=0)
print(data1)
  • 查詢語句

(2)用其他值進行替換

1、將空值替換為0
2、將空值替換為均值
  • 范例
#CSV文件空缺值為空字符串,讀取時限定字符串格式
scores = np.loadtxt("學習成績.csv",delimiter = ',',encoding='utf-8',skiprows=1,dtype=np.str)
# 將空字符串轉換為NAN
scores[scores == ""] = np.NAN
scores.astype(np.float)
# 將字符串全部轉換為浮點類型
scores.astype(np.float)
  • 查詢結果

  • 注意事項

讀取CSV文本中的空值:
:1、先以字符串類型讀取,
:2、空字符串轉換為NAN
:3、將字符串轉換為浮點類型

11、random模塊

(1)隨機數種子seed

  • 用於指定隨機數生成算法開始的整數值
相同seed值:每次生成的隨機數都相同
不設置seed值:根據系統時間選擇這個值
  • 范例
np.random.seed(1)
print(np.random.rand()) #打印固定值
print(np.random.rand()) #打印其他值,因為隨機數種子只對下一次隨機數的產生有影響
  • 查詢結果

(2)隨機數數組

  • 范例
print(np.random.rand(2,3,4)) #生成兩塊3行4列的數組,值在0-1之間
  • 查詢結果

(3)隨機數數組 - 標准正態分布

  • 范例
print(np.random.randn(2,3)) #生成一個2行3列的數組,數組中的值都滿足正態分布
  • 查詢結果

(4)隨機數數組 - 指定范圍

  • 范例
print(np.random.randint(10,size=(3,6)))
  • 查詢結果

(5)隨機采樣

前提條件:必須是一維數組
  • 范例
data = [1,2,3,4,5,6,7,8,9,10]
result1 = np.random.choice(data,3)
result2 = np.random.choice(data,size=(2,2))
print(result1)
print("========")
print(result2)
  • 查詢結果

12、通用函數

12.1、一元函數

函數描述np.abs絕對值np.sqrt開根np.square平方np.exp計算指數e*xnp.log,np.log10,np.log2,np.log1p求對數np.sign標簽化,1,0,-1

12.2、二元函數

函數名稱描述np.add加法np.substract減法np.negative負數,每個值加個符號np.multiply乘法np.divide除法np.floor_divide取整np.mod取余

12.3、聚合函數

函數名稱描述np.sum元素和np.prod元素積np.mean元素均值np.std元素標准差np.var元素方差np.min元素最小值np.max元素最大值np.median元素中位數np.argmax元素最大值索引np.argmin元素最小值索引

12.4、布爾判斷函數

函數名稱函數描述np.any驗證任意一個元素是否為真np.all驗證所有元素是否為真
  • 范例
data = np.random.randint(10,size=(3,4))
print(np.any(data == 5))
print(np.all(data == 5))
  • 查詢結果

12.5、排序

函數名稱函數描述np.sort指定軸進行排序,默認最後一個軸np.argsort返回排序後的下標值
  • 范例
data = np.random.randint(10,size=(3,4))
data1 = np.sort(data)
data2 = np.sort(data,axis=0)
data3 = np.argsort(data)
print(data1)
print("========")
print(data2)
print("========")
print(data3)
print("========")
  • 查詢結果

12.6、其他函數補充

函數名稱函數描述np.apply_along_axis沿著某這軸執行函數np.linespace指定區間內的值平均分成多少份np.unique返回數組中的唯一值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved