阿里雲01--NumPy快速入門課程筆記

本文內容主要來自阿里雲免費課程《Python 科學計算庫 NumPy 快速入門》 課程鏈接

NumPy 官方文檔:https://numpy.org/devdocs/user/quickstart.html

NumPy(Numerical Python)是一個開源的Python科學計算庫,用於快速處理任意維度的數組。Numpy支持常見的數組和矩陣操作。對於同樣的數值計算任務,使用Numpy比直接使用Python要簡潔的多。

Numpy的特性

NumPy 使用 ndarray 來處理多維數組,該對象是一個快速而靈活的大數據容器。

NumPy 提供了一個N維數組類型 ndarray,它描述了相同類型的“items”的集合。

NumPy 專門針對ndarray 的操作和運算進行了設計,所以數組的存儲效率和輸入輸出性能就遠優於Python中的嵌套數組,數組越大,NumPy的優勢就越明顯。

3.1 NumPy的優勢

3.1.1 ndarray的優勢:

  1. 存儲方式
    1. ndarray - 相同類型 -通用性不強
    2. list - 不同類型 - 通用性很強
  2. 並行化運算(向量化運算)
  3. 底層語言
    Numpy 底層使用C語言編寫,內部除了GIL(全局解釋器鎖),對數組的操作速度不夠Python解釋器的限制,效率遠高於純Python代碼。

ndarray與python list的不同
ndarray與python list的不同
上圖可以看出 ndarray 在存儲數據的時候,數據與數據的地址都是連續的,這樣就給是的批量操作數組元素時速度更快。

因爲ndarray中的所有元素的類型都是相同的,而Python list中的元素類型是任意的,所以ndarray在存儲元素時內存可以連續,而Python原生list只能通過尋址的方式找到下一個元素,這雖然也導致了在通用性能方面Numpy的ndarray就可以省掉很多循環語句,代碼使用方面比Python原生list簡單的多。

3.1.2 與常規Python列表相比,NumPy有什麼優勢?

NumPy的數組比Python列表更緊湊-您在Python中描述的列表列表至少需要20 MB左右,而單元格中具有單精度浮點數的NumPy 3D數組則需要4 MB。使用NumPy可以更快地讀取和寫入項目。

也許您只關心一百萬個單元格就不會那麼在意,但您肯定會關心十億個單元格-這兩種方法都不適合32位體系結構,但是如果使用64位版本,NumPy可以節省大約4 GB的內存,僅Python就需要至少約12 GB(很多指針的大小加倍),這是一個昂貴得多的硬件!

差異主要是由於“間接性”所致-Python列表是指向Python對象的指針的數組,每個指針至少4個字節,即使最小的Python對象也至少包含16個字節(類型指針爲4,引用計數爲4,類型爲4值-內存分配器舍入爲16)。NumPy數組是統一值的數組-單精度數字每個佔用4個字節,雙精度數字每個佔用8個字節。靈活性較差,但您需要爲標準Python列表的靈活性付出巨大的代價!
(問題來源於stack overflow)

3.2

3.2.1 ndarray的常用屬性:

1.shape

  • ndim
  • size

2.dtype

  • List item

3.itemsize

在創建ndarray的時候,沒有指定數據類型的時候,默認情況下,整數爲int64,小數默認爲float64.(元素大小爲8個字節)

3.2.2 ndarray的形狀

維度的判斷:中括號[]的層數。第一個元素前有幾層中括號(嵌套)就是幾維。
維度的表示:元組。是幾維的就用幾個元素表示。例如:

import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = np.array([1,2,3,4])
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
a # (2,3) 二維數據表示
b # (4,) 一維數據表示
c # (2, 2,3) 三維數據表示 (最外層嵌套的數組數,嵌套數組中二維數組的行數,嵌套元素中二維數組的列數)

如何理解數組的形狀?

二維數組:
在這裏插入圖片描述
三維數組:
在這裏插入圖片描述
先看最外層有幾個二維數組(如圖中對角線所示),再看二維數組中的數據情況。

3.2.3 ndarray的類型

常用:

  • int32
  • int64
  • flota32
  • float64
  • uint8
np.array(,dtype = “float32”)
np.array(,dtype = np.float32)

3.3 基本操作

  • ndarray.方法
  • ndarray.函數名()

3.3.1生成數組的方法

  • 1)生成0和1
np.zeros(shape) # shape可以用列表,也可以用元祖指定。
np.ones(shape)
  • 2)從現有的數組中生成
np.array() np.copy() 深拷貝
np.asarray() 淺拷貝  如果修改原數組中元素改變,np.asarray()也隨之改變。
  • 3)生成固定範圍的數組
np.linspace(區間起點,區間終點,數據量)  閉區間等距離生成。
np.arange(區間起點,區間終點,步長) 左閉右開以設定步長生成,如果區間終點取不到則不生成。
  • 4)生成隨機數組
    均勻分佈:表示可能性相等的分佈,分佈狀況可以使用matplotlib查看直方圖。
    np.random
import numpy as np
data1 = np.random.uniform(low=-1, high=1, size=1000000)
# 查看數據分佈情況
import matplotlib.pylot as plt
# 創建畫布
plt.figure(figsize=(20,8), dpi=80)
# 繪製直方圖
plt.hist(data1, 1000) 
# 顯示圖像
plt.show()

正態分佈:均值決定了其位置,標準差決定了分佈的幅度,標準差越大,數據越分散。

標準差別稱:幅度/波動程度/集中程度/穩定性

np.random.normal(loc=0.0, scale=1.0, size=None)
loc:均值;scale:標準差;size:數據量。

案例:隨機生成8只股票2周的交易日漲跌幅數據

import numpy as np
stock_change = np.randoms.normal(loc=0, scale=1, size=(8, 10))

3.3.2 數組的索引、切片

### 獲取第一個股票的前3個交易日的漲跌幅數據
stock_change[0, :3] # stock_change[0, 0:3]
#三維數組的索引
a1 = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
a1.shape
a1[1, 0, 2] #索引從零開始計

需求:將剛纔的股票行、日期列翻轉。

3.3.3 形狀修改

  • ndarray.reshape()
  • ndarray.resize()
  • ndarray.T
reshape()方法 有返回值,在不改變原數組數據的情況下,將它reshape成一個新的維度。如果給定的數組數據和需要reshape的形狀不符合時,將會報錯。
stock_change.reshape((10, 8))

#resize()方法 沒有返回值,給定一個數組,和特定維度,將會返回一個給定維度形式的新數組。如果新數組比原數組大,則將會copy原數組中的值對新數組進行填充
stock_change.resize((10, 8))

#.T類似於矩陣轉置操作
stock_change.T

3.3.4 類型修改

  • ndarray.astype(“type”)
  • ndarray.astype(np.type)

ndarray序列化到本地:.tostring()方法

注:有可能遇到jupyter notebook輸出限制的問題(IOPub data rate exceeded),需要修改配置文件。

3.3.5數組的去重

  • set()方法:輸入數據爲一維,需要先用flatten()方法轉換成一維。
  • np.unique()方法 更爲方便。

3.4 ndarray 運算

邏輯運算
	布爾索引
	通用判斷函數
		np.all(布爾值)
			只要有一個False就返回False,只有全是True才返回True
		np.any()
			只要有一個True就返回True,只有全是False才返回False
		np.where()
			np.where(布爾值,True的位置的值,False的位置的值)

統計運算
	統計指標函數
		min, max, mean, median, var, std
		np.函數名
		ndarray.方法
	返回最大值、最小值所在位置

數組間運算

3.4.1 邏輯運算

# 邏輯判斷,如果漲跌幅大於0.5就標記爲True,否則爲False
stock_change > 0.5

# Bool賦值,將滿足條件的設置爲指定的值-布爾索引
stock_change[stock_change > 0.5] = 1

3.4.2 通用判斷函數

np.all()
# 判斷stock_change[0:2, 0:5]是否全是上漲的
np.all(stock_change[0:2, 0:5] > 0) # False

np.any()
np.any(stock_change[0:5, :] > 0 # True

3.4.3 np.where()

# 判斷前四個股票前四天的漲跌幅,大於零的位置爲1,否則爲0
np.where(temp > 0, 1, 0)
	
符合邏輯需要結合np.logical_and 和 np.logical_or使用
# 判斷前四個股票前四天的漲跌幅,大於0.5並且小於1的,換爲1,否則0.
# 判斷前四個股票前四天的漲跌幅,大於0.5並且小於-0.5的換爲1,否則爲0.

np.logical_and(temp > 0.5, temp < 1)

在這裏插入圖片描述

3.4.4 統計運算

# 前四隻股票前四天的最大漲幅
temp.max(axis=0) #按照列求最大值
temp.max(axis=1) #按照行求最大值 

# 計算某隻股票在某個交易日的漲幅最大或最小
np.argmax(temp, axis=)
np.argmin(temp,axis=)

3.5 數組間運算

3.5.1 適用場景

3.5.2 數組與數的運算

  • (+ - / *) numpy的array數組的四則運算與Python list 不同。

3.5.3數組與數組的運算

不同形狀的數組之間是不能運算的,需要滿足廣播機制。

3.5.4廣播機制 (broadcast)

執行廣播機制的前提在於,兩個ndarray執行的是element-wise的運算,broadcast機制的功 能是爲了方便不同形狀的ndarray(numpy庫的核心數據結構)進行數學運算。

當操作兩個數組時,numpy會逐個比較他們的shape(構成元組的tuple),只有在下述情況下,兩個數組才能夠進行數組與數組的運算:

  • 維度相等;
  • shape(其中對應的一個地方爲1)。
    在這裏插入圖片描述
    結果取每個維度上的最大值。如果是下面這樣則不能匹配。
    在這裏插入圖片描述
    在這裏插入圖片描述

3.5.5 矩陣運算

1.什麼是矩陣
	矩陣--二維數組
	矩陣 和二維數組的區別聯繫:矩陣一定是二維數組,反之不成立。
	兩種方法存儲矩陣
		1)ndarray數組
		2)matrix數據結構
2.矩陣乘法運算
	形狀
		(m, n)× (n,l)=(m,l) 引用湯老師口訣:內標決定乘,外標決定型。八達鳥
	運算規則
		略
	矩陣乘法api:
		np.matmul
		np.dot

	ndarray存儲矩陣

	注意:使用運算符運算時,矩陣乘用 *與ndarray乘用@,兩種操作結果相同。

3.6 合併、分割

3.6.1 合併

  • np.hstack(tup) 水平拼接
  • np.vstack(tup) 豎直拼接
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

3.6.2分割

在這裏插入圖片描述

3.7 IO操作與數據處理

3.7.1 Numpy讀取

  • np.genfromtxt(“text.csv”, delimiter=“,”)

讀取會出先有缺失值問題,有些字段的讀取結果會顯示nan,如何處理缺失值的問題,有兩種思路:

  • 數據量足夠多的情況下,直接刪除含有缺失值的樣本;
  • 數據量不足的情況下,使用插補法替換。

處理邏輯:

def fill_nan_by_column_mean(t):
	#t.shape[1]獲取列的索引,按照列進行填充。
	for i in_range(t.shape[1]):
		nan_num = np.count_nonzero(t[:,1][t[:,1] != t[:,i]])
		if nan_num > 0:
			#選中所有行,每一次循環計算一列
			now_col = t[:,i]
			# 求某一列所有不爲nan的元素和
			now_col_not_nan = now_col[np.isnan(now_col) == False].sum()
			# 求均值 = 不爲零元素和和/不爲零元素個數個數
			now_col_mean = now_col_not_nan / (t.shape[0] – nan_num)
			# 賦值給t,即更新t當前列
			t[:,i] = now_col
	return t

Numpy數據運算有優勢,數據處理適合用Pandas。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章