numpy是機器學習裏面基礎數字算法庫,補充了python語言缺少的數字計算能力,Numpy底層由C語言實現,運行效率充分優化。2006年,Numpy脫離Scipy成爲獨立的項目。html
numpy.array() 傳入數組參數,能夠是一維的也能夠是二維三維的,數組會將其轉變成ndarray結構。python
import numpy as np a = np.array([1, 2, 3, 4]) # [1 2 3 4] b = np.array([[1, 2, 3], [1, 2, 3]]) # 建立維度爲2的數組 # [[1 2 3] # [1 2 3]] print(type(a)) # <class 'numpy.ndarray'>
ndarray.ndim 數組的維數算法
print(a.ndim) # 1 print(b.ndim) # 2
ndarray.size 數組的元素數量數組
print(b.size) # 6
len(ndarray) 查看數組的第一維度數dom
print(len(b)) # 2
ndarray.dtype 查看數組元素的類型機器學習
print(type(b)) # <class 'numpy.ndarray'> print(b.dtype) # int32 b = a.astype("float32") print(b.dtype) # float32
類型名 | 表示符 |
布爾型 | bool |
有符號整型 | int8(-128~127)/int16/int32/int64 |
無符號整型 | unit(-128~127)/unit16/unit32/unit64 |
浮點型 | float16/float32/float64 |
複數型 | complex64/complex128 |
字串型 | str,每一個字符用32位Unicode編碼表示 |
假若有以下numpy數據ide
data = [('zs', [50,51,52], 15), ('ls', [83,71,62], 16), ('ww', [90,91,92], 17)]
第一種dtype的設置方式函數
ary = np.array(data,dtype='U2, 3int32, int32') print(ary) # [('zs', [50, 51, 52], 15) # ('ls', [83, 71, 62], 16) # ('ww', [90, 91, 92], 17)] print(ary[0][1]) # [50 51 52] print(ary[0]['f0']) # zs
第二種dtype的設置方式post
ary = np.array(data, dtype={ 'names':['name', 'scores', 'age'], 'formats':['U2', '3int32', 'int32']}) print(ary) # [('zs', [50, 51, 52], 15) # ('ls', [83, 71, 62], 16) # ('ww', [90, 91, 92], 17)] print(ary[0]['age']) # 返回zs的年齡 15 print(ary[2]['scores']) # 返回ww的成績 [90 91 92]
ndarray數組存放日期數據學習
dates = ['2011-01-01', '2012-01-01', '2011-02-01', '2012', '2011-01-01 10:10:10'] ary = np.array(dates) print(ary.dtype) # <U19 ary = ary.astype('M8[D]') print(ary) ['2011-01-01' '2012-01-01' '2011-02-01' '2012-01-01' '2011-01-01'] print(ary.dtype) # datetime64[D] print(ary[1]-ary[0]) # 365 days
類型 | 字符碼 |
np.bool | ? |
np.int8/16/32/64 | i1/i2/i4/i8 |
np.unit8/16/32/64 | u1/u2/u4/u8 |
np.float/16/32/64 | f2/f4/f8 |
np.complex64/128 | c8/c16 |
np.str | U<字符數> |
np.datetime64 | M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s] |
字節序前綴,用於多字節整型和字符串:<小端;>大端;[=]硬件字節序
類型字符碼格式:<字節序前綴><維度><類型><字節數或字符數>
例如:
3i4:3個元素,整型,每一個元素佔4個字節
<(2,3)u8:小端字節序,2行3列的二維數組,無符號整型,每一個元素佔8字節
U7:7個字符的Unicode字符串,每一個字符佔4個字節,採用默認字節序。
視圖變維(數據共享):reshape()和 ravel()
import numpy as np a = np.arange(1, 9) # [1 2 3 4 5 6 7 8] b = a.reshape(2, 4) # 視圖變維 變爲2行4列的二維數組 c = b.reshape(2, 2, 2) # 視圖變維 變爲2頁2行2列的三維數組 d = c.ravel() # 視圖變維 變爲1維數組
print(c.shape) # (2, 2, 2) e = c.flatten() # 壓縮成一維數組 print(e.shape) # (8,)
就地變維:直接改變原數組對象的維度,不返回新數組
import numpy as np a = np.arange(1, 9) print(a.shape) # (8,) a.shape = (2, 4) print(a.shape) # (2, 4) a.resize(2, 2, 2) print(a.shape) # (2, 2, 2)
vector = numpy.array([5, 10, 15, 20]) print(vector[0:3]) # 切片索引取值# [ 5 10 15]
利用返回值獲取元素
import numpy vector = numpy.array([5, 10, 15, 20]) print(vector == 10) # [False True False False] # 利用返回值獲取元素 print(vector[vector == 10])# [10]
多維的切片是按照各個維度分別取的
import numpy as np a = np.arange(25).reshape(5, 5) print(a) # [[ 0 1 2 3 4] # [ 5 6 7 8 9] # [10 11 12 13 14] # [15 16 17 18 19] # [20 21 22 23 24]] # 取第一、2行,第二、三、4列 print(a[1:3, 2:5]) # 多維的切片是按照各個維度分別取 print(a[:, 2:5]) # 行取所有,列取第3-5
有時候將一個切片索引的參數改爲None,那麼ndarray的shape會變
print(a[:, None].shape) # (5, 1, 5)
None表明新增長一個維度,它有一個別稱叫作newaxis,由於在第二維上用了None,因此數組的shape變成了(5, 1, 5)
咱們在第三個維度上看看,shape會變成什麼樣子。
print(a[:, :, None].shape) # (5, 5, 1)
有時候數組的一個維度上是三個點,它是用省略號代替全部冒號,a[:, :, None]和a[…, None]的輸出是同樣的,就是由於…代替了前面兩個冒號。
print(a[..., None].shape) # (5, 5, 1) print(a[:, :, None].shape) # (5, 5, 1)
import numpy as np # 輸出10之內3的倍數 a = np.arange(1, 10) mask = a % 3 == 0 print(mask) # [False False True False False True False False True] print(a[mask]) # [3 6 9] mask = [2, 2, 6, 6, 4, 4] print(a) # [1 2 3 4 5 6 7 8 9] print(a[mask]) # [3 3 7 7 5 5]
arange 指定範圍和數值間的間隔array,np.arange(起始值,終止值,步長),取值範圍左閉右開。
np.arange(0, 10, 2) # [0, 2, 4, 6, 8, 10]
reshape 生成0-14的15個數字,使用reshape(3,5)將其構形成一個三行五列的array
arr = np.arange(15).reshape(3, 5) # array([[0, 1, 2, 3, 4], # [5, 6, 7, 8, 9], # [10, 11, 12, 13, 14]])
squeeze函數 把shape中爲1的維度去掉
arr = arr.reshape(1,1,-1) print(arr) # [[[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]]] print(np.squeeze(arr)) # [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] print(np.squeeze(arr).shape) # (15,)
zero:生成指定結構的默認爲0.的array
a = np.zeros((3,4)) # [[0. 0. 0. 0.] # [0. 0. 0. 0.] # [0. 0. 0. 0.]]
ones:生成一個三維的array,經過dtype指定類型
a = np.ones((2, 3, 4), dtype=np.int32) # 3行4列2層 # [[[1 1 1 1] # [1 1 1 1] # [1 1 1 1]] # # [[1 1 1 1] # [1 1 1 1] # [1 1 1 1]]]
numpy.zeros_like()
創造相同結構的全零數組
ary = np.array([1, 2, 3, 4, 5]) print(np.zeros_like(ary)) # [0 0 0 0 0]
numpy.
linspace
(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
在指定間隔[start, stop]之間返回均勻num個數字,若是endpoint是True,則不會取最後一個端點stop
np.linspace(2.0, 3.0, num=5) # array([ 2. , 2.25, 2.5 , 2.75, 3. ]) np.linspace(2.0, 3.0, num=5, endpoint=False) # array([ 2. , 2.2, 2.4, 2.6, 2.8])
向下取整np.floor()和向下取整np.ceil()
a = np.random.random((2,2)) # [[0.74892422 0.7665049 ] # [0.29296727 0.74230182]] b = np.floor(10*a) # [[7. 7.] # [2. 7.]] b = np.ceil(a) # [[1. 1.] # [1. 1.]]
a.T 轉置(行列變換)
a = np.array([[1,2],[3,4]]) print(a.T)# 轉置 # [[1 3] # [2 4]]
a.resize(1,4) 變換結構,和reshape類似
a = np.array([[1,2],[3,4]]) a.resize(1,4) print(a) # array([[1, 2, 3, 4]])
numpy.clip(a, a_min, a_max, out=None)
把數組a中小於a_min的值都化爲a_min,大於a_max的值都化爲a_max
import numpy as np x=np.array([1,2,3,5,6,7,8,9]) print(np.clip(x,3,8)) # [3 3 3 5 6 7 8 8]
ndarray = numpy.pad(array, pad_width, mode, **kwargs)
參數:
import numpy as np array = np.array([1, 1]) # (1,2)表示在一維數組array前面填充1位,最後面填充2位 # constant_values=(0,2) 表示前面填充0,後面填充2 ndarray=np.pad(array,(1,2),'constant', constant_values=(0,2)) print(array) # [1 1] print(ndarray) # [0 1 1 2 2]
import numpy as np array = np.array([[1, 1],[2,2]]) """ ((1,1),(2,2)) 在二維數組array第一維(此處即是行)前面填充1行,最後面填充1行; 在二維數組array第二維(此處即是列)前面填充2列,最後面填充2列 constant_values=(0,3) 表示第一維填充0,第二維填充3 """ ndarray=np.pad(array,((1,1),(2,2)),'constant', constant_values=(0,3)) print(array) # [[1 1] # [2 2]] print(ndarray) # [[0 0 0 0 3 3] # [0 0 1 1 3 3] # [0 0 2 2 3 3] # [0 0 3 3 3 3]]
np.hstack(a,b) 橫向拼接
import numpy as np a = np.arange(1, 7).reshape(2, 3) b = np.arange(7, 13).reshape(2, 3) # 水平方向完成組合操做,生成新數組 c = np.hstack((a, b)) # (2, 6)
np.vstack(a,b) 縱向拼接
import numpy as np a = np.arange(1, 7).reshape(2, 3) b = np.arange(7, 13).reshape(2, 3) # 垂直方向完成組合操做,生成新數組 c = np.vstack((a, b)) # (4, 3)
np.hsplit(a,2) 矩陣橫向切割 把a橫 豎切成2分
# a.shape (2, 6) # 水平方向完成拆分操做,生成兩個數組 d, e = np.hsplit(c, 2) # d.shape (2, 3) # e.shape (2, 3)
np.vsplit(a,2) 矩陣縱向切割 把a縱 橫切2分
# a.shape (4,3) # 垂直方向完成拆分操做,生成兩個數組 d, e = np.vsplit(a, 2) # d.shape (2, 3) # e.shape (2, 3)
深度方向(3維)
import numpy as np a = np.arange(1, 7).reshape(2, 3) b = np.arange(7, 13).reshape(2, 3) # 深度方向(3維)完成組合操做,生成新數組 i = np.dstack((a, b)) # (2, 3, 2) print(i.shape) # 深度方向(3維)完成拆分操做,生成兩個數組 k, l = np.dsplit(i, 2) # k.shape # (2, 3, 1) # l.shape # (2, 3, 1)
axis的取值
numpy.concatenate((a1, a2, ...), axis=0)
import numpy as np a = np.array([[1, 2], [3, 4]]) # (2, 2) b = np.array([[5, 6]]) # (1, 2) c=np.concatenate((a, b), axis=0) # (3, 2) d=np.concatenate((a, b.T), axis=1) # (2, 3)
拆分,axis的取值同上
np.split(c, 2, axis=0)
注意:拼接的數組,除了須要拼接的維度能夠不一樣,其餘維度必須相同。
例如,a.shape爲(4,5,6,10),b.shape爲(4,5,6,20)
np.concatenate([a,b], axis=3) # 返回張量的shape爲(4,5,6,30)
column是列,row是行。
相加、相減、開根號、e平方、取log對數
a = np.array([10,20,30,40]) b = np.array(4) print(np.abs(-b)) # 取絕對值 print(a - b) # array([ 6, 16, 26, 36]) # 取平方 print(a**2) # array([ 100, 400, 900, 1600]) print(np.square(a)) # 開根號 print(np.sqrt(a**2)) # [10. 20. 30. 40.] # 以e爲底的對數 print(np.exp(a)) # [2.20264658e+04 4.85165195e+08 1.06864746e+13 2.35385267e+17] # 以e爲底的對數 print(np.log(a)) # [2.30258509 2.99573227 3.40119738 3.68887945] # 以10爲底的對數 print(np.log10(a)) # [1. 1.30103 1.47712125 1.60205999]
求和
matrix = numpy.array([[1,2,3], [4,5,6], [7,8,9]]) print(matrix.sum())# 45 print(matrix.sum(1))# 按每行求和 # [ 6 15 24] print(matrix.sum(0))# 按每列求和 # [12 15 18]
sum(1) 是 sum(axis=1)) 的縮寫,1表示按照 x軸方向求和,0表示按照y軸方向求和
矩陣乘法
A*B A.dot(B) np.dot(A,B)
import numpy as np A = np.array([[1, 1], [0, 1]]) B = np.array([[2, 0], [3, 4]]) print(A*B) print(A.dot(B)) # A*B print(np.dot(A,B)) # A*B # [[2 0] # [0 4]]
矩陣求均值
numpy.mean(a, axis, dtype, out,keepdims )
mean()函數功能:求取均值
常常操做的參數爲axis,以m * n矩陣舉例:
a = np.array([[1, 2], [3, 4]]) print(a) # array([[1, 2], # [3, 4]]) print(np.mean(a)) # 2.5 print(np.mean(a, axis=0)) # axis=0,計算每一列的均值 # array([ 2., 3.]) print(np.mean(a, axis=1)) # 計算每一行的均值 # array([ 1.5, 3.5])
numpy的函數有兩種用法,以mean爲例,第一a=np.mean(array);第二a=array.mean()
np.max() np.min() np.ptp(): 返回一個數組中最大值/最小值/極差
np.argmax() np.argmin(): 返回一個數組中最大/最小元素的下標
np.maximum() np.minimum(): 將兩個同維數組中對應元素中最大/最小元素構成一個新的數組
np.median(array) 中位數,若是爲偶數,返回中間兩個元素的平均值。
np.std(array) 標準差
地址複製:經過 b = a 複製 a 的值,b 與 a 指向同一地址,改變 b 同時也改變 a。
1 a = np.arange(12) 2 b = a 3 print(a is b) 4 5 print(a.shape) 6 print(b.shape) 7 b.shape = (3,4) 8 print(a.shape) 9 print(b.shape) 10 11 # True 12 # (12,) 13 # (12,) 14 # (3, 4) 15 # (3, 4)
複製值:經過 a.view() 僅複製值,當對 c 值進行改變會改變 a 的對應的值,而改變 c 的 shape 不改變 a 的 shape,只有值會變,矩陣結構不變
1 a = np.arange(12)# [ 0 1 2 3 4 5 6 7 8 9 10 11] 2 c = a.view() 3 print(c is a) 4 5 c.shape = (2,6) 6 c[0,0] = 9999 7 8 print(a) 9 print(c) 10 11 # False 12 # [9999 1 2 3 4 5 6 7 8 9 10 11] 13 # [[9999 1 2 3 4 5] 14 # [ 6 7 8 9 10 11]]
徹底拷貝:a.copy() 進行的完整的拷貝,產生一份徹底相同的獨立的複製
1 a = np.arange(12) 2 c = a.copy() 3 print(c is a) 4 5 c.shape = 2,6 6 c[0,0] = 9999 7 8 print(a) 9 print(c) 10 11 # False 12 # [ 0 1 2 3 4 5 6 7 8 9 10 11] 13 # [[9999 1 2 3 4 5] 14 # [ 6 7 8 9 10 11]]
numpy的random模塊用於生成隨機數,
numpy.random.random(D0, d1,....dN)
生成[0, 1)之間指定結構的隨機數
np.random.random((2, 3)) # [[ 0.86166627, 0.37756207, 0.94265883], # [ 0.9768257 , 0.96915312, 0.33495431]]
numpy.random.rand(D0, d1, ..., DN):
給定形狀的數組,並在[0,1)之間
np.random.rand(3,2) # array([[ 0.14022471, 0.96360618], #random # [ 0.37601032, 0.25528411], #random # [ 0.49313049, 0.94909878]]) #random
numpy.random.randn(D0, d1, ..., DN):
從「標準正態分佈」返回一個或多個樣本
a = np.random.randn(2, 4) # [[-0.9115162 -1.32887292 -1.02910152 0.8023337 ] # [-1.14456771 -0.53251834 -1.75465906 -1.25668335]]
numpy.random.
normal
(loc = 0.0,scale = 1.0,size = None)
從正態分佈中中抽取隨機樣本,其中均值爲loc,方差爲scale,size是形狀
s = np.random.normal(0,1, 1000) print(s.shape) # (1000,)
numpy.random.randint(low, high=None, size=None, dtype='l'):
生成[low,high)的隨機整數,取數範圍:若high不爲None時,取[low,high)之間隨機整數,不然取值[0,low)之間隨機整數。
a = np.random.randint(5, size=(2, 4)) # array([[4, 0, 2, 1], # [3, 2, 2, 0]]) b = np.random.randint(5,10,size=(2, 4)) # [[6 9 8 5] # [8 8 6 8]]
numpy.random.
uniform
(low=0.0, high=1.0, size=None)
功能:從一個均勻分佈[low,high)中隨機採樣,注意定義域是左閉右開,即包含low,不包含high.
參數:
numpy.random.choice(a, size=None, replace=True, p=None)
從序列中獲取元素,若a爲整數,元素取值爲np.range(a)中隨機數;若a爲數組,取值爲a數組元素中隨機元素。
size:表示從a中隨機選取size個數
replace: 抽樣以後是否放回,False不放回抽樣,True放回抽樣。
p:表示每一個元素被抽取的機率,若是沒有指定,a中全部元素被選取的機率是相等的。
numpy.random.shuffle(x):
對X進行重排序,若是X爲多維數組,只沿第一條軸洗牌(橫軸),輸出爲None。
arr = np.arange(9).reshape((3, 3)) # [[0 1 2] # [3 4 5] # [6 7 8]] np.random.shuffle(arr) # [[3 4 5] # [0 1 2] # [6 7 8]]
numpy.random.seed(seed=None) # 種下隨機種子,使得生成的隨機數相同
numpy.gerfromtxt()用於讀取文件,其中傳入的參數依次是:
一、須要讀取txt文件位置,此處文件與程序位於同一目錄下
二、delimiter 分割的標記
三、dtype 轉換類型,若是文件中既有文本類型也有數字類型,就先轉成文本類型
import numpy world_alcohol = numpy.genfromtxt("world_alcohol.txt", delimiter=",",dtype=str) print(type(world_alcohol)) print(world_alcohol) print(help(numpy.genfromtxt))
help(numpy.genformtxt)用於查看幫助文檔
np.loadtxt("path", delimiter=",", usecols=(1, 3), unpack=False, dtype='u10, f8', converters={1:func})
參數:
import numpy as np import datetime as dt # 日期轉換函數 def dmy2ymd(dmy): # 把「日月年」字符串轉換成「年月日」字符串 dmy = str(dmy, encoding='utf-8') time = dt.datetime.strptime(dmy, '%d-%m-%Y').date() t = time.strftime('%Y-%m-%d') return t dates, opening_prices,highest_prices, lowest_prices, closeing_prices = np.loadtxt( './aapl.csv', # 文件路徑 delimiter=',', # 分隔符 usecols=(1, 3, 4, 5, 6), # 讀取一、三、四、五、6兩列 (下標從0開始) unpack=True, dtype='M8[D], f8, f8, f8, f8', # 制定返回每一列數組中元素的類型 converters={1:dmy2ymd}) print(dates) # 表格中數據 28-01-2011 # 轉換後數據 2011-01-28
若是不設置dtype,t=time.strtime()換成t=time.weekday()獲得的結果是[4. 0. 1. 2. 3. 4. 0. 1.]
a = [1 2 3 4 5] 原數組
b = [8 7 6] 卷積核數組 kernel
使用b做爲卷積覈對a數組作一維卷積運算的過程以下:
44 65 86 有效卷積 (valid) 23 44 65 86 59 同維卷積 (same) 8 23 44 65 86 59 30 徹底卷積 (full) 0 0 1 2 3 4 5 0 0 6 7 8 6 7 8 6 7 8 6 7 8 6 7 8 6 7 8 6 7 8 c = np.convolve(a, b, '卷積類型')
使用卷積函數numpy.convolve(a, b, 卷積類型)實現5日均線
sma52 = np.convolve( closing_prices, np.ones(5) / 5, 'valid') mp.plot(dates[4:], sma52, c='limegreen', alpha=0.5, linewidth=6, label='SMA-5(2)')
加權卷積
使用卷積函數numpy.convolve(a, b, 卷積類型)實現加權5日均線
# 實現加權卷積 # 經過指數函數,尋求一組卷積核 kernel = np.exp(np.linspace(-1, 0, 5)) kernel = kernel[::-1] kernel /= kernel.sum() print(kernel) sma53 = np.convolve(closing_prices, kernel, 'valid') mp.plot(dates[4:], sma53, label='SMA-5(3)', linewidth=1, color='violet', linestyle='-')
import numpy as np import datetime as dt # 轉換器函數:將日-月-年格式的日期字符串轉換爲星期 def dmy2wdays(dmy): dmy = str(dmy, encoding='utf-8') d = dt.datetime.strptime(dmy, '%d-%m-%Y').date() wday = d.weekday() return wday # 加載文件,第一列 wdays時間數據 wdays, closing_prices = np.loadtxt('./aapl.csv', delimiter=',', usecols=(1), unpack=True, converters={1: dmy2wdays}) print(wdays) # [4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 1. 2. 3. 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4.]
日月年轉年月日
def dmy2ymd(dmy): # 把日月年字符串轉爲年月日字符串 print(dmy) # b'11-03-2011' dmy = str(dmy, encoding='utf-8') d = dt.datetime.strptime(dmy, '%d-%m-%Y').date() ymd = d.strftime('%Y-%m-%d') print(ymd) # 2011-03-11 return ymd