數(shù)據(jù)分析之二:用NumPy進(jìn)行數(shù)據(jù)處理

1. NumPy簡介


  • NumPy是Numerical Python的簡稱,用作高性能計算和數(shù)據(jù)分析,其操作是圍繞ndarray這么一個矩陣元素來進(jìn)行。

  • 針對數(shù)據(jù)分析的應(yīng)用,NumPy主要功能體現(xiàn)在如下幾個方面:

  1. 用于數(shù)據(jù)清理和整理、子集構(gòu)造和過濾、轉(zhuǎn)換等快速的矢量化數(shù)組運(yùn)算
  2. 常用的數(shù)組算法,如排序、唯一化、集合運(yùn)算等
  3. 統(tǒng)計和數(shù)據(jù)聚合運(yùn)算
  4. 異構(gòu)數(shù)據(jù)的合并/連接/轉(zhuǎn)換

2. 使用NumPy進(jìn)行數(shù)據(jù)處理


  • 函數(shù)庫的導(dǎo)入,以下簡寫成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]])
  • 或者我想初始化一個空的矩陣,只需要提供行和列即可,例如想創(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')
  • 這里需要理清一個“軸”的概念
    軸(axis)和矩陣空間的維度相關(guān),舉個例子,在平面坐標(biāo)系中,x軸與y軸構(gòu)成二維的平面,由此,x,y,z三個軸組成三維立體空間;

  • 再來看矩陣,如果矩陣是二維的,那么它由2個軸組成,np將它們表示成0軸和1軸,0軸修飾“列方向”,1軸修飾“行方向”,0軸的長度為列向量長度,1軸的長度為行向量長度,那么以上arr = np.array([[1,2,3]]).repeat(4, axis=0)可以理解成將向量[1,2,3]在列方向上重復(fù)多次,生成了4×3矩陣,可以試驗(yàn)一下axis=1的情況,答案是仍然生成一個一維的行向量,因?yàn)樗前凑招蟹较蜓由斓模?/p>

  • 推廣到三維,不難發(fā)現(xiàn),三維空間可以看做由多個二維平面層疊生成的,則三維空間的0軸修飾“平面”,1軸修飾平面的“列”,2軸修飾平面的“行”。

  • 注:矩陣的創(chuàng)建函數(shù):

array         # 將輸入數(shù)據(jù)轉(zhuǎn)換為ndarray,可以指定dtype
asarray       # 將輸入轉(zhuǎn)換為ndarray
arange        # 類似于Python的range函數(shù),可以指定范圍和步長
ones          # 初始化為一個全1的數(shù)組
zeros         # 初始化為一個全0的數(shù)組
empty         #只分配內(nèi)存空間,但不進(jìn)行初始化
eye/identity  # 創(chuàng)建方陣,對角線為全1,其余為0

2.1 數(shù)據(jù)存取


支持Python的下標(biāo)和切片訪問,但是np可以給切片直接賦值,并且切片賦值會影響到原始數(shù)組,這是因?yàn)榍衅僮鞑粫?shù)據(jù)進(jìn)行復(fù)制,數(shù)據(jù)只在內(nèi)存保留一份,對切片的賦值也就是更改原始內(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)計
# 創(chuàng)建一個三維矩陣
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é)果仍然是一個平面
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)計函數(shù):

sum
mean
std/var             # 標(biāo)準(zhǔn)差/方差
min/max
argmin/argmax       #  最小和最大元素的下標(biāo)索引

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容