NumPy個人學習筆記【持續更新】
目錄
基礎知識
NumPy的主要對象是同類型的多維數組。在NumPy中,維度稱爲軸。軸的數目爲rank。
它是一張表,所有元素(通常是數字)的類型都相同,並通過正整數元組索引。
NumPy的數組類被稱爲ndarray。別名爲 array
。
ndarray.ndim:數組的軸(維度)的個數。
ndarray.shape:數組的維度。
ndarray.size:數組元素的總數。
ndarray.dtype:一個描述數組中元素類型的對象。
ndarray.itemsize:數組中每個元素的字節大小。
ndarray.data:該緩衝區包含數組的實際元素。
數組的創建
一個常見的錯誤在於使用多個數值參數調用 array
函數,而不是提供一個數字列表(List)作爲參數。
array
將序列的序列轉換成二維數組,將序列的序列的序列轉換成三維數組,等等。
函數 zeros
創建一個由0組成的數組,函數 ones
創建一個由1數組的數組,函數 empty
內容是隨機的並且取決於存儲器的狀態。默認情況下,創建的數組的dtype是 float64
。
要創建數字序列,NumPy提供了一個arange
的函數,該函數返回數組而不是列表。
當 arange
與浮點參數一起使用時,由於浮點數的精度是有限的,通常不可能預測獲得的元素數量。出於這個原因,通常最好使用函數 linspace
,它接收我們想要的元素數量而不是把長作爲參數。
例:
np.linspace(0,2,9)
#9個從0到2的數字
打印數組
-
最後一個軸從左到右打印,
-
倒數第二個從上到下打印,
-
其餘的也從上到下打印,每個切片與下一個用空行分開。
一維數組被打印爲行、二維爲矩陣和三維爲矩陣列表。
如果數組太大而無法打印,NumPy將自動跳過數組的中心部分並僅打印角點...
要禁用此行爲並強制NumPy打印整個數組,你可以使用 set_printoptions
更改打印選項。
例:
np.set_printoptions(threshold=np.nan)
基本操作
與許多矩陣語言不同,乘法運算符 *
的運算在NumPy數組中是元素級別的。矩陣乘積可以使用 dot
函數或方法執行
某些操作(例如+=和*=)適用於修改現有數組,而不是創建新數組。
當使用不同類型的數組操作時,結果數組的類型對應於更一般或更精確的數組(稱爲向上轉換的行爲)。
通過指定 axis
參數,你可以沿着數組的指定軸應用操作
axis=0 對列操作 axis=1對行操作
通用函數
NumPy提供了常見的數學函數,如sin,cos和exp。In NumPy, these are called “universal functions”( ufunc
). 在NumPy中,這些函數在數組上按元素級別操作,產生一個數組作爲輸出。
NumPy提供了常見的數學函數,如sin,cos和exp。
在NumPy中,這些函數在數組上按元素級別操作,產生一個數組作爲輸出。
索引、切片和迭代
一維數組可以被索引,切片和迭代。
多維數組每個軸可以有一個索引。
當提供比軸數更少的索引時,缺失的索引被認爲是一個完整切片
例:
b
array([[ 0, 1, 2, 3],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]])
b[-1] # 相當於b[-1,:]
array([40, 41, 42, 43])
三個點( ...
)表示產生完整索引元組所需的冒號。例如,如果 x
是rank爲的5數組(即,它具有5個軸),則
x[1,2,...]
等於x[1,2,:,:,:]
。
x[...,3]
等效於x[:,:,:,:,3]
。
x[4,...,5,:]
等效於x[4,:,:,5,:]
。
迭代 多維數組是相對於第一個軸完成的。
如果想要對數組中的每個元素執行操作,可以使用 flat
屬性,該屬性是數組中所有元素的迭代器。
形狀操作
更改數組的形狀
修改數組形狀的命令:
a.ravel() #返回數組,變成一行
a.reshape(x,y) #返回一個x*y型的數組
a.T #返回轉置數組
ndarray.resize
方法修改數組本身
將不同數組堆疊在一起
np.vstack((a,b)) #垂直堆疊
np.hstack((a,b)) #水平堆疊
函數 column_stack
將1D數組作爲列疊加到2D數組中。
對於任何輸入數組,函數 row_stack
相當於 vstack
。一般來說,對於具有兩個以上維度的數組,hstack
沿第二軸堆疊,vstack
沿第一軸堆疊,concatenate
允許一個可選參數,給出串接應該發生的軸。
r_
和 c_
可用於通過沿一個軸疊加數字來創建數組。它們允許使用範圍字面量(“:”)
將一個數組分成幾個較小的數組
使用 hsplit
,可以沿其水平軸拆分數組,通過指定要返回的均勻劃分的數組數量,或通過指定要在其後進行劃分的列
np.hsplit(a,3) # 把a分成三組
np.hsplit(a,(3,4)) # 把a從第3,4列開始拆分
複製和視圖
完全不復制
簡單賦值
函數調用
視圖或淺複製
不同的數組對象可以共享相同的數據。 view
方法創建一個新的數組對象,它查看相同的數據。
對數組切片返回一個視圖:
>>> s = a[ : , 1:3] # spaces added for clarity; could also be written "s = a[:,1:3]"
>>> s[:] = 10 # s[:] is a view of s. Note the difference between s=10 and s[:]=10
>>> a
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
深拷貝
copy
方法生成數組及其數據的完整拷貝。
函數和方法概述
-
數組創建
arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, ones_like, r, zeros, zeros_like
-
轉換
ndarray.astype, atleast_1d, atleast_2d, atleast_3d, mat
-
手法
array_split, column_stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, ndarray.item, newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack
-
問題
all, any, nonzero, where
-
順序
argmax, argmin, argsort, max, min, ptp, searchsorted, sort
-
操作
choose, compress, cumprod, cumsum, inner, ndarray.fill, imag, prod, put, putmask, real, sum
-
基本統計
cov, mean, std, var
-
基本線性代數
cross, dot, outer, linalg.svd, vdot
Less基礎
廣播規則
讓所有輸入數組都向其中shape最長的數組看齊,shape中不足的部分都通過在前面加1補齊 輸出數組的shape是輸入數組shape的各個軸上的最大值
如果輸入數組的某個軸和輸出數組的對應軸的長度相同或者其長度爲1時,這個數組能夠用來計算,否則出錯,當輸入數組的某個軸的長度爲1時,沿着此軸運算時都用此軸上的第一組值
索引技巧
除了通過整數和切片進行索引之外,還可以使用整數數組和布爾數組進行索引。
當被索引的數組 a
是一個多維數組,單個索引數組指的是 a
的第一個維度。
當我們用(整數)索引數組索引數組時,我們提供了要選擇的索引列表。使用布爾值作爲索引時,方法是不同的;我們明確地選擇數組中的哪些元素我們想要的,哪些不是。
>>> a = np.arange(12).reshape(3,4)
>>> b = a > 4
>>> b
array([[False, False, False, False],
[False, True, True, True],
[ True, True, True, True]])
>>> a[b]
array([ 5, 6, 7, 8, 9, 10, 11])
>>> a[b] = 0
>>> a
array([[0, 1, 2, 3],
[4, 0, 0, 0],
[0, 0, 0, 0]])