天天看點

Numpy快速入門Numpy

Numpy

介紹

Numpy (Numerical Python) 是一個開源的Python科學計算庫,用于快速處理任意次元的數組。

Numpy支援常見的數組和矩陣操作。對于同樣的數值計算任務,使用Numpy比直接使用Python要簡潔的多。

Numpy使用ndarray對象來處理多元數組,該對象是一個快速而靈活的大資料容器。

ndarray

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

優勢

  1. 存儲風格
    • ndarray - 相同的資料類型 - 通用性不強
    • list - 可以是不同的資料類型 - 通用性強
  2. 并行化運算
    • ndarray支援向量化運算底層語言
  3. 底層語言
    • Numpy底層使用C語言編寫,内部解除了GIL(全局解釋器鎖),其對數組的操作速度不受Python解釋器的限制,效率遠高于純Python代碼。

屬性

屬性名字 數組次元的元組
ndarray.shape 數組次元的元組
ndarray.ndim 數組維數
ndarray.size 數組中的元素數量
ndarray.itemsize 一個數組元素的長度(位元組)
ndarray.dtype 數組元素的類型

​ 在建立ndarray的時候,如果沒有指定類型,預設:整數 int64/int32 浮點數 float64/float32

使用

import numpy as np
score = np.array([[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
print(type(score))
print(score.shape)
print(score.dtype)
           
# 建立數組的時候指定類型
np.array([1.1, 2.2, 3.3], dtype="float32")
           

基本操作

生成數組

1.生成0和1的數組

np.zeros(shape=(3,4),dtype="float32")# 生成一組0
np.ones(shape=[2,3],dtype=np.int32)# 生成一組1 此處shape屬性設定為元組和清單都是可以的
           

2.從現有數組生成

data1 = np.array(score) # 深拷貝
data2 = np.asarray(score) # 淺拷貝
data3 = np.copy(score) # 深拷貝 當修改拷貝源的時候,淺拷貝發生變化,深拷貝不發生變化
           

3.生成固定範圍的數組

np.linspace(0,10,5)# 生成[0,10]之間等距離的5個數
np.arange(0,11,5) # [0,11),生成5為步長的數組
           

4.生成随機數組

# 生成均勻分布的一組數[low,high)
data1 = np.random.uniform(low=-1, high=1, size=1000000)
# 生成正态分布的一組數,loc:均值;scale:标準差
data2 = np.random.normal(loc=1.75, scale=0.1, size=1000000)
           

數組索引、切片

stock_change = np.random.normal(loc=0, scale=1, size=(8, 10))
# 擷取第一個股票的前3個交易日的漲跌幅資料
print(stock_change[0, :3]) # 兩個參數:行 列
a1 = array([[[1,2],[3,4]],[[5,6],[7,8]]]) #三維數組
           

形狀修改

stock_change.reshape((10, 8)) # 傳回新的ndarray,原始資料沒有改變,源資料為(8,10)
stock_change.resize((10, 8)) # 沒有傳回值,對原始的ndarray進行了修改
stock_change.T # 轉置 行變成列,列變成行
           

類型修改

stock_change.astype("int32")
stock_change.tostring() # ndarray序列化到本地
           

數組去重

temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]])
np.unique(temp) # 生成的還是一個array
set(temp.flatten()) # 生成了一個字典
           

ndarray運算

邏輯運算

運算符

# 邏輯判斷, 如果漲跌幅大于0.5就标記為True 否則為False
stock_change > 0.5
stock_change[stock_change > 0.5] = 1.1
           

通用判斷函數

# 判斷stock_change[0:2, 0:5]是否全是上漲的
np.all(stock_change[0:2, 0:5] > 0)
# 判斷前5隻股票這段期間是否有上漲的
np.any(stock_change[:5, :] > 0)
           

三元運算符

# np.where(布爾值,True的位置的值,False的位置的值)
np.where(temp > 0, 1, 0)
# 大于0.5且小于1
np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0)
# 大于0.5或小于-0.5
np.where(np.logical_or(temp > 0.5, temp < -0.5), 11, 3)
           

統計運算

統計名額函數

min,max,mean(均值),median(中位數),var(方差),std(标準差)

temp.max(axis=0)
np.max(temp, axis=1) # 0代表列,1代表行 不加這個代表是整個矩陣的最大值
           

傳回最大值、最小值的位置

np.argmax(tem,axis=)

np.argmin(tem,axis=)

數組間運算

數組與數的運算

arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr / 10
           

數組與數組的運算

廣播機制

執行broadcast的前提在于,兩個nadarray執行的是element-wise的運算,Broadcast機制的功能是為了友善不同形狀的ndarray(numpy庫的核心資料結構)進行數學運算。

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

  • 次元相等
  • 當維數不相同的時候會觸發

    廣播機制

矩陣運算

英文matrix,和array的差別是矩陣必須是2維的,但是array可以是多元的。

矩陣和二維數組的差別?

np.mat() 将數組轉換成矩陣類型

矩陣乘法規則(M行,N列)x (N行,L列) = (M行,L列)

如果是ndarray

np.dot(data,data1)
np.matmul(data,data1)
data @ data1
           

如果是martix

data*data1
           

合并、分割

numpy.hstack 水準拼接

numpy.vstack 豎拼接

numpy.concatenate((a1,a2),axis=0) 水準|豎拼接

# 分割
numpy.split(x,3) # 分三份
numpy.split(x,[3,4,6,10]) # 按索引分割
           

IO操作與資料處理

讀取資料

如何處理缺失值

兩種思路:

  • 直接删除含有缺失值的樣本
  • 替換/插補 (補入平均值或中位數)