1. 程式人生 > >numpy庫使用總結

numpy庫使用總結

numpy study

0x01:n維陣列物件ndaarray
存放同類型元素的多維陣列

0x02:numpy資料型別
numpy 的數值型別實際上是 dtype 物件的例項,並對應唯一的字元,包括 np.bool_,np.int32,np.float32,等等。
字定義結構化資料型別:

import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) 
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student) 
print(a)

0x03:陣列的屬性
ndarray.ndim: 秩,即軸的數量或維度的數量
ndarray.shape 陣列的維度,對於矩陣,n 行 m 列
ndarray.size 陣列元素的總個數,相當於 .shape 中 n*m 的值
NumPy 也提供了 reshape 函式來調整陣列大小。

a = np.array([[1,2,3],[4,5,6]]) 
b = a.reshape(3,2)  
print (b)

0x04:建立陣列
numpy.empty 方法用來建立一個指定形狀(shape)、資料型別(dtype)且未初始化的陣列:

x = np.empty([3,2], dtype = int) 
print (x)

numpy.zeros/ones 建立指定大小的陣列,陣列元素以 0/1 來填充:

x = np.zeros(5) 
print(x)

x = np.ones(5) 
print(x)

0x05:從已有的陣列中建立陣列
umpy.asarray 類似 numpy.array,但 numpy.asarray 引數只有三個,比 numpy.array 少兩個。

numpy.asarray(a, dtype = None, order = None)
a   任意形式的輸入引數,可以是,列表, 列表的元組, 元組, 元組的元組, 元組的列表,多維陣列
dtype   資料型別,可選
order   可選,有"C"和"F"兩個選項,分別代表,行優先和列優先,在計算機記憶體中的儲存元素的順序。

0x06:從數值範圍建立陣列
numpy 包中的使用 arange 函式建立數值範圍並返回 ndarray 物件,函式格式如下:

numpy.arange(start, stop, step, dtype)

numpy.linspace 函式用於建立一個一維陣列,陣列是一個等差數列構成的,格式如下:

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

umpy.logspace 函式用於建立一個於等比數列。格式如下:

np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

0x07:切片和索引
ndarray物件的內容可以通過索引或切片來訪問和修改,與 Python 中 list 的切片操作一樣。
ndarray 陣列可以基於 0 - n 的下標進行索引,切片物件可以通過內建的 slice 函式,並設定 start, stop 及 step 引數進行,從原陣列中切割出一個新陣列。

a = np.arange(10)
s = slice(2,7,2)   # 從索引 2 開始到索引 7 停止,間隔為2
print (a[s])

冒號 : 的解釋:如果只放置一個引數,如 [2],將返回與該索引相對應的單個元素。如果為 [2:],表示從該索引開始以後的所有項都將被提取。如果使用了兩個引數,如 [2:7],那麼則提取兩個索引(不包括停止索引)之間的項。

import numpy as np
a = np.arange(10)
print(a[2:])

多維陣列同樣適用上述索引提取方法:提取出的為某一行之後的陣列

a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print(a)
# 從某個索引處開始切割
print('從陣列索引 a[1:] 處開始切割')
print(a[1:])

0x08:高階索引
整數陣列索引:兩個陣列對應元素對映確定一個位置
以下例項獲取陣列中(0,0),(1,1)和(2,0)位置處的元素。

x = np.array([[1,  2],  [3,  4],  [5,  6]]) 
y = x[[0,1,2],  [0,1,0]]  
print (y)

0x09:numpy廣播
廣播(Broadcast)是 numpy 對不同形狀(shape)的陣列進行數值計算的方式, 對陣列的算術運算通常在相應的元素上進行。
如果兩個陣列 a 和 b 形狀相同,即滿足 a.shape == b.shape,那麼 a*b 的結果就是 a 與 b 陣列對應位相乘。這要求維數相同,且各維度的長度相同。

a = np.array([1,2,3,4]) 
b = np.array([10,20,30,40]) 
c = a * b 
print (c)

輸出結果為:
[ 10  40  90 160]

當運算中的 2 個數組的形狀不同時,numpy 將自動觸發廣播機制。如:

a = np.array([[ 0, 0, 0],
       [10,10,10],
       [20,20,20],
       [30,30,30]])
b = np.array([1,2,3])
print(a + b)

輸出結果為:
[[ 1  2  3]
 [11 12 13]
 [21 22 23]
 [31 32 33]]

4x3 的二維陣列與長為 3 的一維陣列相加,等效於把陣列 b 在二維上重複 4 次再運算:

0x10:迭代陣列
NumPy 迭代器物件 numpy.nditer 提供了一種靈活訪問一個或者多個數組元素的方式。
迭代器最基本的任務的可以完成對陣列元素的訪問。
接下來我們使用 arange() 函式建立一個 2X3 陣列,並使用 nditer 對它進行迭代。
例項

a = np.arange(6).reshape(2,3)
print ('原始陣列是:')
print (a)
print ('\n')
print ('迭代輸出元素:')
for x in np.nditer(a):
    print (x, end=", " )
print ('\n')

控制遍歷順序:
for x in np.nditer(a, order='F'):Fortran order,即是列序優先;
for x in np.nditer(a.T, order='C'):C order,即是行序優先;

修改陣列中元素的值
nditer 物件有另一個可選引數 op_flags。 預設情況下,nditer 將視待迭代遍歷的陣列為只讀物件(read-only),為了在遍歷陣列的同時,實現對陣列元素值得修改,必須指定 read-write 或者 write-only 的模式。

例項

import numpy as np
 
a = np.arange(0,60,5) 
a = a.reshape(3,4)  
print ('原始陣列是:')
print (a)
print ('\n')
for x in np.nditer(a, op_flags=['readwrite']): 
    x[...]=2*x 
print ('修改後的陣列是:')
print (a)

輸出結果為:

原始陣列是:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


修改後的陣列是:
[[  0  10  20  30]
 [ 40  50  60  70]
 [ 80  90 100 110]]

0x11:陣列操作
Numpy 中包含了一些函式用於處理陣列,大概可分為以下幾類:修改陣列形狀、翻轉陣列、修改陣列維度、連線陣列、分割陣列、陣列元素的新增與刪除

numpy.reshape 函式可以在不改變資料的條件下修改形狀,格式如下: numpy.reshape(arr, newshape, order='C')

numpy.ndarray.flat 是一個數組元素迭代器,例項如下:

import numpy as np
a = np.arange(9).reshape(3,3) 
print ('原始陣列:')
for row in a:
    print (row)
 
# 對陣列中每個元素都進行處理,可以使用flat屬性,該屬性是一個數組元素迭代器:
print ('迭代後的陣列:')
for element in a.flat:
    print (element)

輸出結果如下:
原始陣列:
[0 1 2]
[3 4 5]
[6 7 8]
迭代後的陣列:
0
1
2
3
4
5
6
7
8

flat方法與前面nditer不同的是,nditer是numpy中的一個方法,且預設是隻讀物件,而flat方法是陣列物件的方法。

numpy.ravel() 展平的陣列元素,順序通常是"C風格",返回的是陣列檢視(view,有點類似 C/C++引用reference的意味),修改會影響原始陣列。可以簡單的理解成把多為陣列轉換成一維陣列
該函式接收兩個引數:
numpy.ravel(a, order='C')

numpy.transpose 函式用於對換陣列的維度,行變列,格式如下:
numpy.transpose(arr, axes)
引數說明:
arr:要操作的陣列
axes:整數列表,對應維度,通常所有維度都會對換。

numpy.ndarray.T 類似 numpy.transpose:列變行

numpy.swapaxes 函式用於交換陣列的兩個軸,格式如下:
numpy.swapaxes(arr, axis1, axis2)
arr:輸入的陣列
axis1:對應第一個軸的整數
axis2:對應第二個軸的整數

連線陣列

|函式|描述|
|:--|:|
|concatenate|連線沿現有軸的陣列序列|
|stack|沿著新的軸加入一系列陣列|
|hstack|水平堆疊序列中的陣列(列方向)|
|vstack|豎直堆疊序列中的陣列(行方向)|

分割陣列

|函式| |陣列及操作|
|:|:|
|split| 將一個數組分割為多個子陣列
|hsplit| 將一個數組水平分割為多個子陣列(按列)
|vsplit |將一個數組垂直分割為多個子陣列(按行)

陣列元素的新增與刪除

|函式 |元素及描述
|:|:|
|resize |返回指定形狀的新陣列
|append |將值新增到陣列末尾
|insert |沿指定軸將值插入到指定下標之前
|delete |刪掉某個軸的子陣列,並返回刪除後的新陣列
|unique |查詢陣列內的唯一元素

0x12:numpy位運算
NumPy "bitwise_" 開頭的函式是位運算函式。
NumPy 位運算包括以下幾個函式:

|函式|描述
|:|:|
|bitwise_and|對陣列元素執行位與操作
|bitwise_or |對陣列元素執行位或操作
|invert |按位取反
|left_shift |向左移動二進位制表示的位
|right_shift|向右移動二進位制表示的位

0x13:numpy字串函式
以下函式用於對 dtype 為 numpy.string_ 或 numpy.unicode_ 的陣列執行向量化字串操作。 它們基於 Python 內建庫中的標準字串函式。這些函式在字元陣列類(numpy.char)中定義。

|函式 |描述
|:|
|add() |對兩個陣列的逐個字串元素進行連線,元素之間進行對映
|multiply() |返回按元素多重連線後的字串,把一個字串返回多次
|center() |居中字串,並使用指定字元在左側和右側進行填充。
|capitalize() |將字串第一個字母轉換為大寫
|title() |將字串的每個單詞的第一個字母轉換為大寫
|lower() |對陣列的每個元素轉換為小寫。它對每個元素呼叫 str.lower。
|upper() |函式對陣列的每個元素轉換為大寫。它對每個元素呼叫 str.upper。
|split() |通過指定分隔符對字串進行分割,並返回陣列。預設情況下,分隔符為空格。
|splitlines() |函式以換行符作為分隔符來分割字串,並返回陣列。
|strip() |移除元素開頭或者結尾處的特定字元
|join() |通過指定分隔符來連線陣列中的元素
|replace() |使用新字串替換字串中的所有子字串
|decode() |陣列元素依次呼叫str.decode
|encode() |陣列元素依次呼叫str.encode

0x14:numpy的數學計算
NumPy 包含大量的各種數學運算的函式,包括三角函式,算術運算的函式,複數處理函式等.

三角函式:NumPy 提供了標準的三角函式:sin()、cos()、tan()。

numpy.around() 函式返回指定數字的四捨五入值
numpy.around(a,decimals)
引數說明:
a: 陣列
decimals: 舍入的小數位數。 預設值為0。 如果為負,整數將四捨五入到小數點左側的位置

numpy.floor() 返回數字的下舍整數。

numpy.ceil() 返回數字的上入整數。

0x15:numpy的算術函式
NumPy 算術函式包含簡單的加減乘除: add(),subtract(),multiply() 和 divide()。

print ('兩個陣列相加:')
print (np.add(a,b))

print ('兩個陣列相減:')
print (np.subtract(a,b))

print ('兩個陣列相乘:')
print (np.multiply(a,b))

print ('兩個陣列相除:')
print (np.divide(a,b))

numpy.reciprocal() 函式返回引數逐元素的倒數。如 1/4 倒數為 4/1。

a = np.array([0.25,  1.33,  1,  100])  
print ('我們的陣列是:')
print (a)
print ('\n')
print ('呼叫 reciprocal 函式:')
print (np.reciprocal(a))

numpy.power() 函式將第一個輸入陣列中的元素作為底數,計算它與第二個輸入陣列中相應元素的冪

numpy.mod() 計算輸入陣列中相應元素的相除後的餘數。 函式 numpy.remainder() 也產生相同的結果。引數是兩個陣列,第一個數組裡的元素做被除數,返回一個餘數組成的陣列

0x16:numpy統計函式
NumPy 提供了很多統計函式,用於從陣列中查詢最小元素,最大元素,百分位標準差和方差等:

numpy.amin() 用於計算陣列中的元素沿指定軸的最小值。1表示一行中最小,0表示一列中最小 空表示陣列中最小
numpy.amax() 用於計算陣列中的元素沿指定軸的最大值。

a = np.array([[3,7,5],[8,4,3],[2,4,9]])  
print (a)

print (np.amin(a,1))

print (np.amin(a,0))

print (np.amax(a))

print (np.amax(a, axis =  0))

mpy.ptp()函式計算陣列中元素最大值與最小值的差(最大值 - 最小值)

print ('呼叫 ptp() 函式:')
print (np.ptp(a))

print ('沿軸 1 呼叫 ptp() 函式:')
print (np.ptp(a, axis =  1))

print ('沿軸 0 呼叫 ptp() 函式:')
print (np.ptp(a, axis =  0))

numpy.median() 函式用於計算陣列 a 中元素的中位數(中值):按行、列或整個陣列計算

numpy.mean() 函式返回陣列中元素的算術平均值:按行、列或整個陣列計算

numpy.average() 函式根據在另一個數組中給出的各自的權重計算陣列中元素的加權平均值。

0x17:numpy排序、條件篩選函式
排序演算法:'quicksort'(快速排序) 'mergesort'(歸併排序) 'heapsort'(堆排序)
numpy.sort() 函式返回輸入陣列的排序副本。函式格式如下:
numpy.sort(a, axis, kind, order)
引數說明:
a: 要排序的陣列
axis: 沿著它排序陣列的軸,如果沒有陣列會被展開,沿著最後的軸排序, axis=0 按列排序,axis=1 按行排序
kind: 預設為'quicksort'(快速排序)
order: 如果陣列包含欄位,則是要排序的欄位

numpy.argsort() 函式返回的是陣列值從小到大的索引值。

numpy.argmax() 和 numpy.argmin()函式分別沿給定軸返回最大和最小元素的索引。

numpy.where() 函式返回輸入陣列中滿足給定條件的元素的索引。

numpy.extract() 函式根據某個條件從陣列中抽取元素,返回滿條件的元素。

0x18:numpy矩陣庫(matrix)
matlib.empty() 函式返回一個新的矩陣,語法格式為:
numpy.matlib.empty(shape, dtype, order)
引數說明:
shape: 定義新矩陣形狀的整數或整數元組
Dtype: 可選,資料型別
order: C(行序優先) 或者 F(列序優先)

import numpy.matlib 
import numpy as np
print (np.matlib.empty((2,2)))
  • numpy.matlib.zeros() 函式建立一個以 0 填充的矩陣。
  • numpy.matlib.ones()函式建立一個以 1 填充的矩陣。
  • numpy.matlib.rand() 函式建立一個給定大小的矩陣,資料是隨機填充的。
  • numpy.matlib.identity() 函式返回給定大小的單位矩陣。單位矩陣是個方陣,從左上角到右下角的對角線(稱為主對角線)上的元素均為 1,除此以外全都為 0。

numpy.matlib.eye() 函式返回一個矩陣,對角線元素為 1,其他位置為零。
numpy.matlib.eye(n, M,k, dtype)
引數說明:
n: 返回矩陣的行數
M: 返回矩陣的列數,預設為 n
k: 對角線的索引
dtype: 資料型別
例項:

import numpy.matlib 
import numpy as np 
print (np.matlib.eye(n =  3, M =  4, k =  0, dtype =  float))

0x19:numpy線性代數
NumPy 提供了線性代數函式庫 linalg,該庫包含了線性代數所需的所有功能,可以看看下面的說明:

|函式 |描述
|:|
|dot |兩個陣列的點積,即元素對應相乘。
|vdot |兩個向量的點積
|inner ||兩個陣列的內積
|matmul |兩個陣列的矩陣積
|determinant |陣列的行列式
|solve |求解線性矩陣方程
|inv |計算矩陣的乘法逆矩陣

numpy 和 matplotlib

from matplotlib import pyqlot as plt

plt.title 圖形標題
plt.xlable x軸標題
plt.ylable y軸標題
plt.plot(x, y) 畫圖
plt.show() 顯示圖
plt.hist

subplot() 函式允許你在同一圖中繪製不同的東西,就是說可以把一塊畫布分為若干個子畫布,在子畫布畫不同的東西。子畫布能分多少。取決於為子畫布設定的高和寬。函式需要三個引數,第一個是子畫布的高,第二個是子畫布的寬,第三個是子畫布的序號。子畫布的實際高和寬是你設定高和寬的倒數,加入設定高為4,寬為2,那麼子畫布的實際高和寬就是整個畫布的1/4 1/2,高和寬設定的越小,子畫布分數量越多。所有子畫布的高或寬不能超過1

bar() 函式來生成條形圖:傳入的兩個陣列元素數量必須相等,具有畫圖功能,代替上面的plt.plot

numpy.histogram() 函式是資料的頻率分佈的圖形表示。 水平尺寸相等的矩形對應於類間隔,稱為 bin,變數 height 對應於頻率。
numpy.histogram()函式將輸入陣列和 bin 作為兩個引數。 bin 陣列中的連續元素用作每個 bin 的邊界