簡(jiǎn)介NumPy(Numerical Python)是 Python 中的一個(gè)線性代數(shù)庫(kù),。對(duì)每一個(gè)數(shù)據(jù)科學(xué)或機(jī)器學(xué)習(xí) Python 包而言,,這都是一個(gè)非常重要的庫(kù),,SciPy(Scientific Python),、Matplotlib(plotting library),、Scikit-learn 等都在一定程度上依賴 NumPy,。 如果已經(jīng)安裝了 導(dǎo)入NumPy按照傳統(tǒng),,通常用 import numpy as np 從Python列表創(chuàng)建數(shù)組可以用 # 整型數(shù)組: array([1, 4, 2, 5, 3])
np.array([3.14, 4, 2, 3]) array([3.14, 4. , 2. , 3. ]) 可以用 np.array([1, 2, 3, 4], dtype='float32') array([1., 2., 3., 4.], dtype=float32)
np.array([range(i , i+3) for i in [2, 4, 6]]) array([[2, 3, 4], 從頭創(chuàng)建數(shù)組
# 創(chuàng)建一個(gè)值都為0,長(zhǎng)度為10的數(shù)組 array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) # 創(chuàng)建一個(gè)值都為1,,3*5的浮點(diǎn)型數(shù)組 array([[1., 1., 1., 1., 1.], # 創(chuàng)建一個(gè)值都為3.14,,3*5的浮點(diǎn)型數(shù)組 array([[3.14, 3.14, 3.14, 3.14, 3.14], # 創(chuàng)建一個(gè)值為線性序列,從0到20,,步長(zhǎng)為2的數(shù)組 array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) # 創(chuàng)建一個(gè)有5個(gè)元素的數(shù)組,,且這5個(gè)數(shù)均勻分配到0~1 array([0. , 0.25, 0.5 , 0.75, 1. ]) # 創(chuàng)建一個(gè)3*3的,在0~1均勻分布的隨機(jī)數(shù)組成的數(shù)組 array([[0.36709154, 0.97609935, 0.53257059], # 創(chuàng)建一個(gè)3*3的,,均值為0,,方差為1的正態(tài)分布的隨機(jī)數(shù)數(shù)組 array([[-0.01152638, 0.88988951, -0.21171668], # 創(chuàng)建一個(gè)3*3的、`[0, 10)`區(qū)間的隨機(jī)整型數(shù)組 array([[6, 3, 8], # 創(chuàng)建一個(gè)由3個(gè)整型數(shù)組成的未初始化的數(shù)組 array([9.80485013e-312, 0.00000000e+000, 9.76154329e-313]) NumPy標(biāo)準(zhǔn)數(shù)據(jù)類型
NumPy數(shù)組的屬性介紹一些有用的數(shù)組屬性,。首先用 np.random.seed(0) # 設(shè)置種子 每個(gè)數(shù)組有 print('x3 ndim: ', x3.ndim) x3 ndim: 3 其他屬性包括數(shù)組元素的字節(jié)大小 print('itemsize:', x3.itemsize, 'bytes') itemsize: 4 bytes 數(shù)組索引:獲取單個(gè)元素和Python列表一樣,,對(duì)于 x1 array([5, 0, 3, 3, 7, 9]) x1[0] 5 x1[4] 7 同樣可以用負(fù)值來(lái)進(jìn)行末尾索引: x1[-1] 9 在多維數(shù)組中,用逗號(hào)分隔的索引元組獲取元素: x2 array([[3, 5, 2, 4], x2[0, 0] 3 x2[2, -1] 7 也可以用以上索引方式修改元素值: x2[0, 0] = 12 array([[12, 5, 2, 4], 注意,, x1[0] = 3.14159 array([3, 0, 3, 3, 7, 9]) 數(shù)組切片:獲取子數(shù)組為了獲取數(shù)組 一維子數(shù)組x = np.arange(10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) x[:5] # 前5個(gè)元素 array([0, 1, 2, 3, 4]) x[4:7] # 中間的子數(shù)組 array([4, 5, 6]) x[::2] # 每隔一個(gè)元素取 array([0, 2, 4, 6, 8]) x[1::2] # 每隔一個(gè)元素取,從索引1開(kāi)始 array([1, 3, 5, 7, 9]) 當(dāng)步長(zhǎng)值為負(fù)時(shí),, x[::-1] # 逆序排列 array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]) x[5::-2] # 從索引5開(kāi)始每隔一個(gè)元素逆序 array([5, 3, 1]) 多維子數(shù)組x2 array([[12, 5, 2, 4], x2[:2, :3] # 兩行三列 array([[12, 5, 2], x2[:3, ::2] # 所有行,每隔一列 array([[12, 2], x2[::-1, ::-1] # 逆序 array([[ 7, 7, 6, 1], 獲取數(shù)組的行和列print(x2[:, 0]) # x2的第一列 [12 7 1] print(x2[0,:]) # x2的第一行 [12 5 2 4] 在獲取行時(shí)也可以: print(x2[0]) [12 5 2 4] 非副本視圖的子數(shù)組數(shù)組切片返回的是數(shù)組數(shù)據(jù)的視圖,,而不是數(shù)組數(shù)據(jù)的副本,。 print(x2) [[12 5 2 4] 從中抽取一個(gè)2*2的子數(shù)組: x2_sub = x2[:2, :2] [[12 5] 如果修改這個(gè)子數(shù)組,原始數(shù)組也會(huì)被改變: x2_sub[0, 0] = 99 [[99 5] print(x2) [[99 5 2 4] 這種特性意味著,,當(dāng)我們處理非常大的數(shù)據(jù)集時(shí),,可以直接獲取這些數(shù)據(jù)的片段進(jìn)行處理。 創(chuàng)建數(shù)組的副本有時(shí)候我們也想明確地復(fù)制數(shù)組里的數(shù)據(jù)或子數(shù)據(jù),,這時(shí)候可以使用 x2_sub_copy = x2[:2, :2].copy() [[99 5] 如果修改這個(gè)數(shù)組,,原始的數(shù)組不會(huì)被改變: x2_sub_copy[0, 0] = 42 [[42 5] print(x2) [[99 5 2 4] 數(shù)組的變形使用 grid = np.arange(1, 10).reshape((3, 3)) [[1 2 3] 注意,,原始數(shù)組的大小必須和變形后數(shù)組的大小一致,。你也可以通過(guò) x = np.array([1, 2, 3]) array([[1, 2, 3]]) 也可以通過(guò) # 通過(guò)newaxis獲得的行向量 array([[1, 2, 3]]) # 通過(guò)變形獲得的列向量 array([[1], # 通過(guò)newaxis獲得的列向量 array([[1], 數(shù)組的拼接和分裂以上操作都是針對(duì)單一數(shù)組的,有時(shí)候我們也需要把多個(gè)數(shù)組成為一個(gè),,或?qū)⒁粋€(gè)數(shù)組拆分成多個(gè),。 數(shù)組的拼接x = np.array([1, 2, 3]) array([1, 2, 3, 3, 2, 1]) 也可以一次性拼接兩個(gè)以上數(shù)組: z = [99, 99, 99] array([ 1, 2, 3, 3, 2, 1, 99, 99, 99])
grid = np.arange(1,7).reshape((2, 3)) array([[1, 2, 3], # 沿著第一個(gè)軸拼接 array([[1, 2, 3], # 沿著第二個(gè)軸拼接(從0開(kāi)始索引) array([[1, 2, 3, 1, 2, 3], 沿著固定維度處理初級(jí)使用 x = np.array([1, 2, 3]) array([[1, 2, 3], # 水平拼接數(shù)據(jù) array([[ 9, 8, 7, 99], 數(shù)組的分裂同樣,分裂可以通過(guò) x = [1, 2, 3, 99, 99, 3, 2, 1] [1 2 3] [99 99] [3 2 1]
grid = np.arange(16).reshape((4, 4)) array([[ 0, 1, 2, 3], upper, lower = np.vsplit(grid, [2]) [[0 1 2 3] left, right = np.hsplit(grid, [2]) [[ 0 1] |
|