Python數據挖掘基礎(二):Numpy

1. Numpy的優勢

Python已經提供了很多豐富的內置包,我們爲什麼還要學習NumPy呢?先看一個例子,找尋學習 NumPy 的必要性和重要性。如下:
在這裏插入圖片描述
完成同樣的都對元素相加的操作,NumPyPython快了11倍之多。這就是我們要學好NumPy的一個重要理由,它在處理更大數據量時,處理效率明顯快於Python。並且內置的向量化運算和廣播機制,使得使用NumPy更加簡潔,會少寫很多嵌套的for循環,因此代碼的可讀性大大增強。NumPy計算爲什麼這麼快呢?原因如下:

  1. Pythonlist是一個通用結構。它能包括任意類型的對象,並且是動態類型。
  2. NumPyndarray靜態、同質 的類型,當ndarray對象被創建時,元素的類型就確定。由於是靜態類型,所以ndarray間的加、減、乘、除用 CFortran 實現才成爲可能,所以運行起來就會更快。根據官方介紹,底層代碼用 C語言Fortran 語言實現,實現性能無限接近 C 的處理效率。
    在這裏插入圖片描述
    從圖中我們看出來 NumPy 其實在存儲數據的時候,數據與數據的地址都是連續的,這樣就給我們操作帶來了好處,處理速度快。
  3. 支持並行化運算,也叫向量化運算。當然向量是數學當中的概念,我們不過多解釋,只需要知道他的優勢即可。也就是說 NumPy 底層使用 BLAS 做向量,矩陣運算。
    numpy的許多函數不僅是用C實現了,還使用了BLAS(一般Windows下link到MKL的,下link到OpenBLAS)
    基本上那些BLAS實現在每種操作上都進行了高度優化
    例如使用AVX向量指令集,甚至能比你自己用C實現快上許多,更不要說和用Python實現的比
    

由此可見,NumPy 就非常適合做大規模的數值計算和數據分析。

2. 數組屬性

數組屬性反映了數組本身固有的信息。

屬性名字 屬性解釋
ndarray.shape 數組維度的元組
ndarray.flags 有關陣列內存佈局的信息
ndarray.ndim 數組維數
ndarray.size 數組中的元素數量
ndarray.itemsize 一個數組元素的長度(字節)
ndarray.nbytes 數組元素消耗的總字節數

示例代碼如下:

import numpy as np

# 數組的屬性
# 1.創建數組 這裏先不用管 後續會詳細講解數組的創建方法
a = np.array([[1,2,3],[4,5,6]])
b = np.array([1,2,3,4])
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
# 創建數組的時候指定類型
# dtype更多取值: int complex bool object
# 還可以顯示的定義數據位數的類型,如: int64、int16、float128、complex128。
d = np.array([1,2,3,4], dtype=np.float)

# 2.測試數組屬性
print(a.shape)  # 數組形狀  (2, 3): 二維數組
print(b.shape)  # (4,) 一維數組: 有4個元素
print(c.shape)  # (2, 2, 3): 三維數組
print(a.ndim)  # 數組維數 2
print(a.size)  # 元素的數量 6 
print(a.itemsize)  # 每一個元素佔的位數(字節) 8
print(a.nbytes)  # 總共佔的字節數 6*8 ==> 48
print(a.flags)  # 陣列內存佈局
print(a.dtype)  # 數組類型 int64
print(d.dtype)  # float64

上述代碼執行結果如下:
在這裏插入圖片描述

3. 創建數組

1. 創建0和1的數組 示例代碼如下:
在這裏插入圖片描述
2. 從現有的數據中創建 示例代碼如下:

num_list = [[1,2,3], [4,5,6]]
a = np.array(num_list)
a1 = np.array(a)  # 創建了一個新的數組
a2 = np.asarray(a)  # 還是引用原來的數組
print(a)
print(a1)
print(a2)
a[0] = 10
a, a1, a2

上述代碼執行結果如下:
在這裏插入圖片描述
3. 創建固定範圍的數組,語法格式如下:

np.linspace(start, stop, num, endpoint, retstep, dtype) 生成等間隔的序列
start:序列的起始值
stop:序列的終止值
num:要生成的等間隔樣例數量,默認爲50
endpoint:序列中是否包含stop值,默認爲True
retstep:如果爲True,返回樣例,以及連續數字之間的步長
dtype:輸出ndarray的數據類型

示例代碼如下:

arr = np.linspace(0, 10, 10)
arr

執行結果如圖所示:
在這裏插入圖片描述
其它的還有:

  1. numpy.arange(start,stop, step, dtype) 示例代碼如下:
    np.arange(1, 10, 2)
    
    運行結果如圖所示:
    在這裏插入圖片描述
  2. numpy.logspace(start,stop, num, endpoint, base, dtype) 構造一個從10的-2次方10的2次方等比數列,這個等比數列的長度是 10 個元素,示例代碼如下:
    np.logspace(-2,2,10)
    
    運行結果如圖所示:
    在這裏插入圖片描述
    如果不想是10的次方,也就是想改變基數,那麼可以這麼寫,代碼如下:
    np.logspace(-2,2,10,base=2)
    
    運行結果如圖所示:
    在這裏插入圖片描述

4. 創建隨機數組

np.random 模塊生成隨機數組,更加方便,示例代碼如下:
在這裏插入圖片描述
上面產生的數據是屬於一個均勻分佈。那麼什麼是均勻分佈呢?在概率論和統計學中,均勻分佈也叫矩形分佈,它是對稱概率分佈,在相同長度間隔的分佈概率是等可能的。 均勻分佈由兩個參數a和b定義,它們是數軸上的最小值和最大值,通常縮寫爲U(a,b)。

正態分佈?給定均值/標準差/維度的正態分佈,示例代碼如下:
在這裏插入圖片描述
正態分佈是一種概率分佈。正態分佈是具有兩個參數μσ的連續型隨機變量的分佈,第一參數μ是服從正態分佈的隨機變量的均值,第二個參數σ是此隨機變量的方差,所以正態分佈記作N(μ,σ )
在這裏插入圖片描述
生活、生產與科學實驗中很多隨機變量的概率分佈都可以近似地用正態分佈來描述。μ決定了其位置,其標準差σ。決定了分佈的幅度。當μ = 0,σ = 1時的正態分佈是標準正態分佈
在這裏插入圖片描述
標準差如何來?方差是在概率論和統計方差衡量一組數據時離散程度的度量。
在這裏插入圖片描述
其中M爲平均值,n爲數據總個數,s爲標準差,s^2可以理解一個整體爲方差。
在這裏插入圖片描述
通過索引切片等獲取數組中的值,一維數組示例代碼如下:
在這裏插入圖片描述
二維數組示例代碼如下:
在這裏插入圖片描述
三維數組示例代碼如下:
在這裏插入圖片描述

4. 數組形狀與類型變化

1. ndarray.reshape(shape[, order]) Returns an array containing the same data with a new shape. 示例代碼如下:
在這裏插入圖片描述
2. ndarray.resize(new_shape[, refcheck]) Change shape and size of array in-place. 示例代碼如下:
在這裏插入圖片描述
3. 修改類型 ndarray.astype(type) 示例代碼如下:
在這裏插入圖片描述
4. 修改小數位數 ndarray.round(arr, out) Return a with each element rounded to the given number of decimals. 示例代碼如下:
在這裏插入圖片描述
5. ndarray.flatten([order]) Return a copy of the array collapsed into one dimension. 示例代碼如下:
在這裏插入圖片描述
6. ndarray.T 數組的轉置 將數組的行、列進行互換 示例代碼如下:
在這裏插入圖片描述
7. ndarray.tostring([order])或者ndarray.tobytes([order]) Construct Python bytes containing the raw data bytes in the array. 轉換成bytes
在這裏插入圖片描述
8. ndarray.copy([order]) Return a copy of the array. 當我們不想修改某個數據的時候,就可以去進行拷貝操作。在拷貝的數據上進行操作,示例代碼如下:
在這裏插入圖片描述

4. 數組運算

4.1 邏輯運算

在這裏插入圖片描述
通用判斷函數,np.all(),示例代碼如下:
在這裏插入圖片描述
np.unique():返回新的數組的數值,不存在重複的值,示例代碼如下:
在這裏插入圖片描述
np.where (三元運算符):通過使用np.where能夠進行更加複雜的運算,示例代碼如下:
在這裏插入圖片描述

4.2 統計運算

在數據挖掘/機器學習領域,統計指標的值也是我們分析問題的一種方式。注意:進行統計的時候,axis軸 的取值並不一定, NumPy中不同的API軸的值都不一樣,在這裏,axis 0代表列, axis 1代表行 去進行統計。常用的指標如下:

  1. min(a[, axis, out, keepdims]) Return the minimum of an array or minimum along an axis. 示例代碼如下:
    在這裏插入圖片描述
  2. max(a[, axis, out, keepdims]) Return the maximum of an array or maximum along an axis. 示例代碼如下:
    在這裏插入圖片描述
  3. median(a[, axis, out, overwrite_input, keepdims]) Compute the median along the specified axis. 示例代碼如下:
    在這裏插入圖片描述
  4. mean(a[, axis, dtype, out, keepdims]) Compute the arithmetic mean along the specified axis. 示例代碼如下:
    在這裏插入圖片描述
  5. std(a[, axis, dtype, out, ddof, keepdims]) Compute the standard deviation along the specified axis. 示例代碼如下:
    在這裏插入圖片描述
  6. var(a[, axis, dtype, out, ddof, keepdims]) Compute the variance along the specified axis. 示例代碼如下:
    在這裏插入圖片描述
  7. np.argmax(temp, axis=) 示例代碼如下:
    在這裏插入圖片描述
  8. np.argmin(temp, axis=) 示例代碼如下:
    在這裏插入圖片描述

4.3 數組間運算

數組與數的運算,示例代碼如下:
在這裏插入圖片描述
矩陣運算,什麼是矩陣?矩陣,英文matrix,和array的區別矩陣必須是2維的,但是array可以是多維的。示例代碼如下:
在這裏插入圖片描述

4.4 合併分割

  1. numpy.concatenate((a1, a2, …), axis=0) 示例代碼如下:
    在這裏插入圖片描述
  2. numpy.hstack(tup) Stack arrays in sequence horizontally (column wise). 示例代碼如下:
    在這裏插入圖片描述
  3. numpy.vstack(tup) Stack arrays in sequence vertically (row wise). 示例代碼如下:
    在這裏插入圖片描述
  4. numpy.split(ary, indices_or_sections, axis=0) Split an array into multiple sub-arrays. 示例代碼如下:
    在這裏插入圖片描述
    切割如果不太懂的話,可以點擊 此處 參考學習。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章