1. Numpy的優勢
Python已經提供了很多豐富的內置包,我們爲什麼還要學習NumPy呢?先看一個例子,找尋學習 NumPy 的必要性和重要性。如下:
完成同樣的都對元素相加的操作,NumPy
比Python
快了11倍之多。這就是我們要學好NumPy
的一個重要理由,它在處理更大數據量時,處理效率明顯快於Python
。並且內置的向量化運算和廣播機制,使得使用NumPy
更加簡潔,會少寫很多嵌套的for
循環,因此代碼的可讀性大大增強。NumPy
計算爲什麼這麼快呢?原因如下:
Python
的list
是一個通用結構。它能包括任意類型的對象,並且是動態類型。NumPy
的ndarray
是靜態、同質
的類型,當ndarray
對象被創建時,元素的類型就確定。由於是靜態類型,所以ndarray
間的加、減、乘、除用C
和Fortran
實現才成爲可能,所以運行起來就會更快。根據官方介紹,底層代碼用C語言
和Fortran
語言實現,實現性能無限接近C
的處理效率。
從圖中我們看出來NumPy
其實在存儲數據的時候,數據與數據的地址都是連續的,這樣就給我們操作帶來了好處,處理速度快。- 支持並行化運算,也叫向量化運算。當然向量是數學當中的概念,我們不過多解釋,只需要知道他的優勢即可。也就是說
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
執行結果如圖所示:
其它的還有:
- numpy.arange(start,stop, step, dtype) 示例代碼如下:
運行結果如圖所示:np.arange(1, 10, 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代表行
去進行統計。常用的指標如下:
- min(a[, axis, out, keepdims]) Return the minimum of an array or minimum along an axis. 示例代碼如下:
- max(a[, axis, out, keepdims]) Return the maximum of an array or maximum along an axis. 示例代碼如下:
- median(a[, axis, out, overwrite_input, keepdims]) Compute the median along the specified axis. 示例代碼如下:
- mean(a[, axis, dtype, out, keepdims]) Compute the arithmetic mean along the specified axis. 示例代碼如下:
- std(a[, axis, dtype, out, ddof, keepdims]) Compute the standard deviation along the specified axis. 示例代碼如下:
- var(a[, axis, dtype, out, ddof, keepdims]) Compute the variance along the specified axis. 示例代碼如下:
- np.argmax(temp, axis=) 示例代碼如下:
- np.argmin(temp, axis=) 示例代碼如下:
4.3 數組間運算
數組與數的運算,示例代碼如下:
矩陣運算,什麼是矩陣?矩陣,英文matrix,和array的區別矩陣必須是2維
的,但是array可以是多維的。示例代碼如下:
4.4 合併分割
- numpy.concatenate((a1, a2, …), axis=0) 示例代碼如下:
- numpy.hstack(tup) Stack arrays in sequence horizontally (column wise). 示例代碼如下:
- numpy.vstack(tup) Stack arrays in sequence vertically (row wise). 示例代碼如下:
- numpy.split(ary, indices_or_sections, axis=0) Split an array into multiple sub-arrays. 示例代碼如下:
切割如果不太懂的話,可以點擊 此處 參考學習。