1. NumPy簡(jiǎn)介
NumPy是Numerical Python的簡(jiǎn)稱牌废,用作高性能計(jì)算和數(shù)據(jù)分析,其操作是圍繞
ndarray
這么一個(gè)矩陣元素來(lái)進(jìn)行啤握。針對(duì)數(shù)據(jù)分析的應(yīng)用鸟缕,NumPy主要功能體現(xiàn)在如下幾個(gè)方面:
- 用于數(shù)據(jù)清理和整理、子集構(gòu)造和過(guò)濾排抬、轉(zhuǎn)換等快速的矢量化數(shù)組運(yùn)算
- 常用的數(shù)組算法懂从,如排序、唯一化蹲蒲、集合運(yùn)算等
- 統(tǒng)計(jì)和數(shù)據(jù)聚合運(yùn)算
- 異構(gòu)數(shù)據(jù)的合并/連接/轉(zhuǎn)換
2. 使用NumPy進(jìn)行數(shù)據(jù)處理
- 函數(shù)庫(kù)的導(dǎo)入番甩,以下簡(jiǎn)寫成
np
import numpy as np
2.1 矩陣的創(chuàng)建
In [1]: arr = np.array([[1,2,3]])
In [2]: arr
Out[2]: array([[1, 2, 3]])
也可以像下面這樣批量生成
In [3]: arr = np.array([[1,2,3]]).repeat(4, axis=0)
In [4]: arr
Out[4]:
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
- 或者我想初始化一個(gè)空的矩陣,只需要提供行和列即可届搁,例如想創(chuàng)建3×4的矩陣缘薛,用empty或者zeros函數(shù)
In [6]: arr = np.empty((3,4))
In [7]: arr
Out[7]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
- 查看矩陣的維度,行列數(shù)以及元素的數(shù)據(jù)類型
In [10]: arr = np.array([[1,2,3],[4,5,6]])
In [11]: arr
Out[11]:
array([[1, 2, 3],
[4, 5, 6]])
In [12]: arr.ndim
Out[12]: 2
In [13]: arr.shape
Out[13]: (2, 3)
In [14]: arr.dtype
Out[14]: dtype('int64')
這里需要理清一個(gè)“軸”的概念
軸(axis)和矩陣空間的維度相關(guān)卡睦,舉個(gè)例子宴胧,在平面坐標(biāo)系中,x軸與y軸構(gòu)成二維的平面么翰,由此牺汤,x,y浩嫌,z三個(gè)軸組成三維立體空間檐迟;再來(lái)看矩陣,如果矩陣是二維的码耐,那么它由2個(gè)軸組成追迟,np將它們表示成0軸和1軸,0軸修飾“列方向”骚腥,1軸修飾“行方向”敦间,0軸的長(zhǎng)度為列向量長(zhǎng)度,1軸的長(zhǎng)度為行向量長(zhǎng)度束铭,那么以上
arr = np.array([[1,2,3]]).repeat(4, axis=0)
可以理解成將向量[1,2,3]
在列方向上重復(fù)多次廓块,生成了4×3矩陣,可以試驗(yàn)一下axis=1
的情況契沫,答案是仍然生成一個(gè)一維的行向量带猴,因?yàn)樗前凑招蟹较蜓由斓模?/p>推廣到三維,不難發(fā)現(xiàn)懈万,三維空間可以看做由多個(gè)二維平面層疊生成的拴清,則三維空間的0軸修飾“平面”,1軸修飾平面的“列”会通,2軸修飾平面的“行”口予。
注:矩陣的創(chuàng)建函數(shù):
array # 將輸入數(shù)據(jù)轉(zhuǎn)換為ndarray,可以指定dtype
asarray # 將輸入轉(zhuǎn)換為ndarray
arange # 類似于Python的range函數(shù)涕侈,可以指定范圍和步長(zhǎng)
ones # 初始化為一個(gè)全1的數(shù)組
zeros # 初始化為一個(gè)全0的數(shù)組
empty #只分配內(nèi)存空間沪停,但不進(jìn)行初始化
eye/identity # 創(chuàng)建方陣,對(duì)角線為全1裳涛,其余為0
2.1 數(shù)據(jù)存取
支持Python的下標(biāo)和切片訪問(wèn)木张,但是np可以給切片直接賦值,并且切片賦值會(huì)影響到原始數(shù)組调违,這是因?yàn)榍衅僮鞑粫?huì)對(duì)數(shù)據(jù)進(jìn)行復(fù)制窟哺,數(shù)據(jù)只在內(nèi)存保留一份,對(duì)切片的賦值也就是更改原始內(nèi)存技肩,如果想在切片上重新分配一塊內(nèi)存區(qū)域且轨,可以使用ndarray.copy()
函數(shù)。
In [22]: arr = np.arange(10)
In [23]: arr
Out[23]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [24]: arr[5]
Out[24]: 5
In [25]: arr[5:8]
Out[25]: array([5, 6, 7])
In [26]: arr[5:8] = 10
In [27]: arr
Out[27]: array([ 0, 1, 2, 3, 4, 10, 10, 10, 8, 9])
2.3 矩陣運(yùn)算
- 變換
In [28]: arr = np.arange(15).reshape((3,5))
In [29]: arr
Out[29]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
# 轉(zhuǎn)置操作
In [30]: arr.T
Out[30]:
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
# 矩陣乘法
In [31]: np.dot(arr, arr.T)
Out[31]:
array([[ 30, 80, 130],
[ 80, 255, 430],
[130, 430, 730]])
- 排序
In [40]: arr = randn(8)
In [41]: arr
Out[41]:
array([-0.04165555, -0.58147668, -0.1026614 , -2.00641289, -0.94810499,
0.68015849, -0.94358531, -0.12948516])
In [42]: arr.sort()
In [43]: arr
Out[43]:
array([-2.00641289, -0.94810499, -0.94358531, -0.58147668, -0.12948516,
-0.1026614 , -0.04165555, 0.68015849])
In [44]: arr = randn(3,4)
In [45]: arr
Out[45]:
array([[-0.31807417, -0.12209285, -0.35218604, 1.86467014],
[-0.87586945, 0.48491914, 0.02919893, -0.89746354],
[ 0.75919047, 0.61933593, 0.22276992, -0.63860342]])
# 沿1軸方向上的排序(行方向虚婿,也是sort默認(rèn)方向)
In [46]: arr.sort(axis=1)
In [47]: arr
Out[47]:
array([[-0.35218604, -0.31807417, -0.12209285, 1.86467014],
[-0.89746354, -0.87586945, 0.02919893, 0.48491914],
[-0.63860342, 0.22276992, 0.61933593, 0.75919047]])
- 統(tǒng)計(jì)
# 創(chuàng)建一個(gè)三維矩陣
In [15]: arr = np.random.randint(0,9,[2,3,3])
In [16]: arr
Out[16]:
array([[[7, 0, 4],
[3, 1, 7],
[3, 8, 1]],
[[2, 3, 5],
[0, 3, 4],
[2, 6, 7]]])
# 0軸上相加旋奢,也就是平面相加,結(jié)果仍然是一個(gè)平面
In [17]: arr.sum(axis=0)
Out[17]:
array([[ 9, 3, 9],
[ 3, 4, 11],
[ 5, 14, 8]])
# 1軸上相加然痊,也就是各平面上沿著列方向相加
In [18]: arr.sum(axis=1)
Out[18]:
array([[13, 9, 12],
[ 4, 12, 16]])
# 2軸上相加至朗,也就是各平面上沿著行方向相加
In [19]: arr.sum(axis=2)
Out[19]:
array([[11, 11, 12],
[10, 7, 15]])
注:數(shù)學(xué)統(tǒng)計(jì)函數(shù):
sum
mean
std/var # 標(biāo)準(zhǔn)差/方差
min/max
argmin/argmax # 最小和最大元素的下標(biāo)索引