NumPy 基礎(chǔ):數(shù)組和矢量計(jì)算
NumPy 的 ndarray : 一種多維數(shù)組對(duì)象
import numpy as np
data = np.array()
data.shape #對(duì)象的結(jié)構(gòu)慈省,如(2,3)
data.dtype #對(duì)象元素的數(shù)據(jù)類型
data.ndim #對(duì)象的維度
創(chuàng)建ndarray
data = [] #創(chuàng)建一個(gè)list對(duì)象
arr = np.array(data) #傳遞一個(gè)list對(duì)象創(chuàng)建ndarray對(duì)象
np.zeros(10) #創(chuàng)建長度為10的全0數(shù)組
np.ones(10) #創(chuàng)建長度為10的全1數(shù)組
np.zeros((3,6)) #創(chuàng)建3行6列的全0二維數(shù)組
np.arrange(10) #對(duì)應(yīng)python內(nèi)置的range函數(shù)
數(shù)組創(chuàng)建函數(shù)
函數(shù) | 說明 |
---|---|
array | 將輸入數(shù)據(jù)(列表轩触、元祖课幕、數(shù)組或其他序列類型)轉(zhuǎn)換為ndarray。 |
asarray | 將輸入轉(zhuǎn)換為ndarray悠轩,如果輸入本身就是一個(gè)ndarray就不進(jìn)行復(fù)制。 |
arrange | 類似于內(nèi)置的range。 |
ones孽尽、ones_like | 根據(jù)指定的形狀和dtype創(chuàng)建一個(gè)全1數(shù)組于游。ones_like以另一個(gè)數(shù)組為參數(shù)毁葱。 |
zeros、zeros_like | 同上 |
empty贰剥、empty_like | 創(chuàng)建新數(shù)組倾剿,只分配內(nèi)存空間但不填充任何值。 |
eye蚌成、identity | 創(chuàng)建一個(gè)正方的NxN單位矩陣(對(duì)角線為1前痘,其余為0) |
ndarray的數(shù)據(jù)類型
arr1 = np.array([1, 2, 3], dtype=np.float64)
arr2 = np.array([1, 2, 3], dtype=np.int32)
float_arr1 = arr1.astype(np.float64) #data.astype()顯式轉(zhuǎn)換數(shù)據(jù)類型
float_arr2 = arr2.astype(arr1.dtype)
調(diào)用astype無論如何都會(huì)常見一個(gè)新的數(shù)組(原始數(shù)組的一份拷貝),即使新dtype跟老dtype相同也是如此担忧。
基本的索引和切片
一維數(shù)組跟Python列表的功能差不多芹缔,跟列表最重要的區(qū)別在于,數(shù)組切片是原始數(shù)組的視圖瓶盛,并非拷貝最欠。如果要想得到的是ndarray切片的一個(gè)副本而非視圖坡锡,就需要顯式的進(jìn)行復(fù)制操作,例如==arr[5:8].copy()==窒所。
以下兩種方式是等價(jià)的
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2d[0][2]
arr2d[0, 2]
切片索引
ndarray的切片語法跟Python列表這樣的一維對(duì)象差不多鹉勒。高維度對(duì)象的花樣更多,可以在一個(gè)或多個(gè)軸上進(jìn)行切片吵取,也可以跟整數(shù)索引混合使用禽额。
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2d
Out:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
arr2d[:2]
Out:
array([[1, 2, 3],
[4, 5, 6]])
arr2d[:2,1:]
Out:
array([[2, 3],
[5, 6]])
布爾型索引
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = randn(7,4) //使用numpy.random中的randn函數(shù)生成一些正態(tài)分布的隨機(jī)數(shù)據(jù)。
data
Out:
array([[-0.29387507, 0.17205361, 0.66953008, 1.52117065],
[ 1.10443341, 1.38657273, -0.07698117, 0.14266073],
[ 0.76090409, 0.971822 , -0.32016532, 0.8410247 ],
[-0.16898366, 0.18393705, -0.68519614, 1.22744236],
[ 0.50100988, -0.75611675, 0.18750586, -1.64240784],
[-0.3859573 , 0.53440464, -0.74281885, 0.83665929],
[-0.52089554, 0.65959834, -0.17651269, -1.58237464]])
names == 'Bob'
Out: array([ True, False, False, True, False, False, False], dtype=bool)
data[names == 'Bob']
Out:
array([[-0.29387507, 0.17205361, 0.66953008, 1.52117065],
[-0.16898366, 0.18393705, -0.68519614, 1.22744236]])
布爾型數(shù)組的長度必須跟被索引的軸長度一致皮官。還可以跟切片脯倒、整數(shù)(或整數(shù)序列)混合使用:
data[names == 'Bob',2:]
Out:
array([[ 0.66953008, 1.52117065],
[-0.68519614, 1.22744236]])
要選擇“Bob”以外的其他值,既可以使用不等于號(hào)(!=)捺氢,也可以通過負(fù)號(hào)(-)對(duì)條件進(jìn)行否定:
data[names != 'Bob']
data[-(names == 'Bob')]
如果需要對(duì)布爾條件進(jìn)行組合使用藻丢,可以使用&(和)、|(或)之類的布爾算數(shù)運(yùn)算符即可:
mask = (names == 'Bob') | (names == 'Will')
mask
Out: array([ True, False, True, True, True, False, False], dtype=bool)
data[mask]
Out:
array([[-0.29387507, 0.17205361, 0.66953008, 1.52117065],
[ 0.76090409, 0.971822 , -0.32016532, 0.8410247 ],
[-0.16898366, 0.18393705, -0.68519614, 1.22744236],
[ 0.50100988, -0.75611675, 0.18750586, -1.64240784]])
通過布爾型索引選取數(shù)組中的數(shù)據(jù)摄乒,總是創(chuàng)建數(shù)據(jù)的副本悠反,即使返回一模一樣的數(shù)組也是如此。
==Python關(guān)鍵字and和or在布爾型數(shù)組中無效馍佑。==
可以對(duì)數(shù)組中的一些符合條件的數(shù)據(jù)進(jìn)行重新賦值:
data[data < 0] = 0
data
Out:
array([[ 0. , 0.17205361, 0.66953008, 1.52117065],
[ 1.10443341, 1.38657273, 0. , 0.14266073],
[ 0.76090409, 0.971822 , 0. , 0.8410247 ],
[ 0. , 0.18393705, 0. , 1.22744236],
[ 0.50100988, 0. , 0.18750586, 0. ],
[ 0. , 0.53440464, 0. , 0.83665929],
[ 0. , 0.65959834, 0. , 0. ]])
花式索引
即利用整數(shù)數(shù)組進(jìn)行索引斋否。
為了以特定的書序選取行子集,只需傳入一個(gè)用于指定順序的整數(shù)列表或ndarray即可:
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
arr
Out:
array([[ 0., 0., 0., 0.],
[ 1., 1., 1., 1.],
[ 2., 2., 2., 2.],
[ 3., 3., 3., 3.],
[ 4., 4., 4., 4.],
[ 5., 5., 5., 5.],
[ 6., 6., 6., 6.],
[ 7., 7., 7., 7.]])
arr[[4, 3, 0, 6]]
Out:
array([[ 4., 4., 4., 4.],
[ 3., 3., 3., 3.],
[ 0., 0., 0., 0.],
[ 6., 6., 6., 6.]])
一次傳入多個(gè)索引數(shù)組返回的是一個(gè)以為數(shù)組拭荤,其中的元素對(duì)應(yīng)各個(gè)索引元組:
arr = np.arange(32).reshape((8, 4))
arr
Out:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])
arr[[1, 5, 7, 2], [0, 3, 1, 2]] #返回的是元素(1,0)茵臭、(5,3)、(7,1)和(2,2)舅世。
Out: array([ 4, 23, 29, 10])
我們可以通過以下方式獲取矩陣的行列子集:
arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
Out:
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])
還可以通過使用np.ix函數(shù)旦委,它可以將兩個(gè)一維整數(shù)數(shù)組轉(zhuǎn)換為一個(gè)用于選取方形區(qū)域的所引器:
arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])]
Out:
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])
==花式索引總是將數(shù)據(jù)復(fù)制到新數(shù)組中。==
數(shù)組轉(zhuǎn)置和軸對(duì)換
==轉(zhuǎn)置是重塑的一種特殊形式雏亚,它返回的事源數(shù)據(jù)的視圖(不會(huì)進(jìn)行任何復(fù)制操作)==缨硝。數(shù)組不僅有transppose方法,還有一個(gè)特殊的T屬性:
arr = np.arange(15).reshape((3, 5))
arr
Out:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
arr.T
Out:
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
arr = np.random.randn(6, 3)
np.dot(arr.T, arr) #利用np.dot計(jì)算矩陣內(nèi)積X.T*X
對(duì)于高維數(shù)組评凝,transpose需要得到一個(gè)由軸編號(hào)組成的元組才能對(duì)這些軸進(jìn)行轉(zhuǎn)置(比較費(fèi)腦子):
arr = np.arange(16).reshape((2, 2, 4))
arr
Out:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.transpose(1,0,2)
Out:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
ndarray還有一個(gè)swapaxes方法追葡,它接受一對(duì)軸編號(hào):
arr
Out:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.swapaxes(1,2)
Out:
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
通用函數(shù):快速的元素級(jí)數(shù)組函數(shù)
一元ufunc
函數(shù) | 說明 |
---|---|
abs、fabs | 計(jì)算整數(shù)奕短、浮點(diǎn)數(shù)或復(fù)數(shù)的絕對(duì)值宜肉。對(duì)于復(fù)數(shù)數(shù)值,可以使用更快的fabs翎碑。 |
sqrt | 計(jì)算各元素的平方根 |
square | 計(jì)算各元素的平方 |
exp | 計(jì)算各元素的指數(shù)e^x |
log谬返、log10、log2日杈、log1p | 分別為自然對(duì)數(shù)遣铝、底數(shù)為10的log佑刷、底數(shù)為2的log、log(1 + x) |
sign | 計(jì)算各元素的正負(fù)號(hào):1(正數(shù))酿炸、0(零)瘫絮、-1(負(fù)數(shù)) |
ceil | 計(jì)算各元素的ceiling值 |
floor | 計(jì)算各元素的floor值 |
rint | 四舍五入到正數(shù),保留dtype |
modf | 將數(shù)組的小數(shù)和整數(shù)部分以兩個(gè)獨(dú)立數(shù)組的形式返回 |
isnan | 返回一個(gè)表示“哪些值是NaN”的布爾型數(shù)組 |
isfinite填硕、isinf | 分別返回一個(gè)表示“哪些元素是有窮的”或“哪些元素是無窮的”的布爾型數(shù)組 |
cos麦萤、cosh、sin扁眯、sinh壮莹、tan、tanh | 普通型和雙曲型三角函數(shù) |
arccos姻檀、arccosh命满、arcsin、arcsinh绣版、arctan胶台、arctanh | 反三角函數(shù) |
logical_not | 計(jì)算各元素not x的真值。想到與-arr |
二元ufunc
函數(shù) | 說明 | |
---|---|---|
add | 將數(shù)組中對(duì)應(yīng)的元素相加 | |
subtract | 從第一個(gè)數(shù)組中減去第二個(gè)數(shù)組中的元素 | |
multiply | 數(shù)組元素相乘 | |
divide僵娃、floor_divide | 除法或向下圓整除法 | |
power | 對(duì)第一個(gè)數(shù)組中的元素A概作,根據(jù)第二個(gè)數(shù)組中的相應(yīng)元素B,計(jì)算A的B次方 | |
maximum腋妙、fmax | 元素級(jí)的最大值計(jì)算默怨。fmax忽略NaN | |
minmum、fmin | 元素級(jí)的最小值計(jì)算骤素。fmin忽略NaN | |
mod | 元素級(jí)的求模計(jì)算 | |
copysign | 將第二個(gè)數(shù)組中的值得負(fù)號(hào)復(fù)制到第一個(gè)數(shù)組中的值 | |
greate匙睹、greate_equal、less济竹、less_equal痕檬、equal、not_equal | 執(zhí)行元素級(jí)的比價(jià)運(yùn)算送浊,最終產(chǎn)生布爾型的數(shù)組梦谜。相當(dāng)于運(yùn)算符>、>=袭景、<唁桩、<=、==耸棒、!= | |
logical_and荒澡、logical_or、logical_xor | 執(zhí)行元素級(jí)的真值邏輯運(yùn)算与殃。相當(dāng)于中綴運(yùn)算符&单山、 | 碍现、^ |
利用數(shù)組進(jìn)行數(shù)據(jù)處理
將條件邏輯表述為數(shù)組運(yùn)算
numpy.where 函數(shù)是三元表達(dá)式 x if condition else y 的矢量化版本。
xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
cond = np.array([True, False, True, True, False])
result = [(x if c else y)
.....: for x, y, c in zip(xarr, yarr, cond)]
result
Out: [1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]
這樣做會(huì)有許多問題米奸。首先昼接,對(duì)于大的數(shù)組,它不會(huì)很快(因?yàn)樗械墓ぷ鞫际怯屑働ython來做的)悴晰。其次辩棒,對(duì)于多維數(shù)組,它不能工作膨疏。使用 np.where 你可以像這樣非常簡(jiǎn)潔的編寫:
result = np.where(cond, xarr, yarr)
result
Out: array([ 1.1, 2.2, 1.3, 1.4, 2.5])
np.where 的第一個(gè)和第二個(gè)參數(shù)不需要是數(shù)組一睁;它們中的一個(gè)或兩個(gè)可以是純量。 在數(shù)據(jù)分析中 where 的典型使用是生成一個(gè)新的數(shù)組佃却,其值基于另一個(gè)數(shù)組者吁。假如你有一個(gè)矩陣,其數(shù)據(jù)是隨機(jī)生成的饲帅,你想要把其中的正值替換為2复凳,負(fù)值替換為-2,使用 np.where 非常容易:
arr = randn(4, 4)
arr
Out:
array([[ 0.6372, 2.2043, 1.7904, 0.0752],
[-1.5926, -1.1536, 0.4413, 0.3483],
[-0.1798, 0.3299, 0.7827, -0.7585],
[ 0.5857, 0.1619, 1.3583, -1.3865]])
np.where(arr > 0, 2, -2)
Out:
array([[ 2, 2, 2, 2],
[-2, -2, 2, 2],
[-2, 2, 2, -2],
[ 2, 2, 2, -2]])
np.where(arr > 0, 2, arr) # 僅設(shè)置正值為 2
Out:
array([[ 2. , 2. , 2. , 2. ],
[-1.5926, -1.1536, 2. , 2. ],
[-0.1798, 2. , 2. , -0.7585],
[ 2. , 2. , 2. , -1.3865]])
np.where 可以嵌套使用灶泵。
數(shù)學(xué)統(tǒng)計(jì)方法
一組數(shù)學(xué)函數(shù)育八,計(jì)算整個(gè)數(shù)組或一個(gè)軸向上數(shù)據(jù)的統(tǒng)計(jì),和數(shù)組函數(shù)一樣是容易訪問的赦邻。聚合(通常被稱為 reductions )髓棋,如 sum , mean 惶洲,標(biāo)準(zhǔn)偏差 std 可以使用數(shù)組實(shí)例的方法按声,也可以使用頂層NumPy的函數(shù):
arr = randn(5,4)
arr
Out:
array([[ 0.39013323, -0.65003199, -1.7659255 , 0.50657869],
[ 1.49064958, -2.12313076, -0.06437275, -1.74020972],
[ 0.58393273, -2.54944833, 1.3207072 , 0.4929906 ],
[ 0.29181077, 0.24600015, -0.88524769, 0.1694354 ],
[-1.29550423, -0.67156125, 0.04152137, 0.6270823 ]])
arr.mean()
Out: -0.27922950905899768
np.mean(arr)
Out: -0.27922950905899768
arr.sum()
Out: -5.5845901811799532
np.sum(arr)
Out: -5.5845901811799532
像 mean 和 sun 函數(shù)可以有一個(gè)可選的 axis參數(shù),它對(duì)給定坐標(biāo)軸進(jìn)行統(tǒng)計(jì)恬吕,結(jié)果數(shù)組將會(huì)減少一個(gè)維度:
arr.mean(axis=1)
Out[84]: array([-0.37981139, -0.60926591, -0.03795445, -0.04450034, -0.32461545])
arr.sum(0)
Out[86]: array([ 1.46102209, -5.74817217, -1.35331736, 0.05587727])
像 cumsum 和 cumprod 這些函數(shù)并不聚集签则,而是產(chǎn)生一個(gè)中間結(jié)果組成的數(shù)組:
arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
arr.cumsum(axis=0)
Out:
array([[ 0, 1, 2],
[ 3, 5, 7],
[ 9, 12, 15]])
arr.cumprod(axis=0)
Out:
array([[ 0, 1, 2],
[ 0, 4, 10],
[ 0, 28, 80]])
數(shù)學(xué)統(tǒng)計(jì)方法清單
方法 | 描述 |
---|---|
sum | 對(duì)數(shù)組的所有或一個(gè)軸向上的元素求和。零長度的數(shù)組的和為靈铐料。 |
mean | 算術(shù)平均值渐裂。靈長度的數(shù)組的均值為NaN。 |
std, var | 標(biāo)準(zhǔn)差和方差钠惩,有可選的調(diào)整自由度(默認(rèn)值為n)柒凉。 |
min, max | 最大值和最小值 |
argmin, argmax | 索引最小和最大元素。 |
cumsum | 從0元素開始的累計(jì)和妻柒。 |
cumprod | 從1元素開始的累計(jì)乘扛拨。 |
用于布爾型數(shù)組的方法
在上面的方法中,布爾值被強(qiáng)制為1( True )和0a( False )举塔。因此绑警, sum 經(jīng)常被用來作為對(duì)一個(gè)布爾數(shù)組中的 True 計(jì)數(shù)的手段:
arr = randn(100)
(arr > 0).sum() # 正值的個(gè)數(shù)
Out: 44
有兩個(gè)額外的方法求泰, any 和 all ,對(duì)布爾數(shù)組尤其有用计盒。 any 用來測(cè)試一個(gè)數(shù)組中是否有一個(gè)或更多的 True 渴频,而 all 用來測(cè)試所有的值是否為 True :
bools = np.array([False, False, True, False])
bools.any()
Out: True
bools.all()
Out: False
==這些方法這些方法也可以工作在非布爾型數(shù)組上,非零元素作為 True 北启。==
排序
arr.sort(axis=None)會(huì)就地排序修改數(shù)組本身卜朗,而np.sort(arr,axis=None)返回的是數(shù)組的已排序數(shù)組。計(jì)算數(shù)組分位數(shù)最簡(jiǎn)單的方法是對(duì)其進(jìn)行排序咕村,然后選取特定位置的值:
large_arr = randn(1000)
large_arr.sort()
large_arr[int(0.05 * len(large_arr))] # 5% 分位點(diǎn)
Out: -1.5791023260896004
唯一化以及其他的集合邏輯
Numpy有一些基本的針對(duì)一維ndarrays的集合操作场钉。最常使用的一個(gè)可能是 np.unique ,它返回一個(gè)數(shù)組的經(jīng)過排序的 unique 值:
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
np.unique(names)
Out:
array(['Bob', 'Joe', 'Will'],
dtype='|S4')
ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
np.unique(ints)
Out: array([1, 2, 3, 4])
另一個(gè)函數(shù) np.in1d 用于測(cè)試一個(gè)數(shù)組中的值在另一個(gè)數(shù)組中的成員資格懈涛,返回一個(gè)布爾型數(shù)組:
values = np.array([6, 0, 0, 3, 2, 5, 6])
np.in1d(values, [2, 3, 6])
Out: array([ True, False, False, True, True, False, True], dtype=bool)
函數(shù) | 說明 |
---|---|
unique(x) | 計(jì)算x單一的元素逛万,并對(duì)結(jié)果排序 |
intersect1d(x, y) | 計(jì)算x和y相同的元素,并對(duì)結(jié)果排序 |
union1d | 結(jié)合x和y的元素批钠,并對(duì)結(jié)果排序 |
in1d(x, y) | 得到一個(gè)布爾數(shù)組指示x中的每個(gè)元素是否在y中 |
setdiff1d(x, y) | 差集宇植,在x中但不再y中的集合 |
setxor1d(x, y) | 對(duì)稱差集,不同時(shí)在兩個(gè)數(shù)組中的元素 |
用于數(shù)組的文件輸入輸出
NumPy 能夠保存數(shù)據(jù)到磁盤和從磁盤加載數(shù)據(jù),不論數(shù)據(jù)是文本或二進(jìn)制的。
將數(shù)組以二進(jìn)制格式保存到磁盤
np.save 和 np.load 是兩個(gè)主力功能眉厨,有效的保存和加載磁盤數(shù)據(jù)。數(shù)組默認(rèn)保存為未經(jīng)過壓縮的原始二進(jìn)制數(shù)據(jù)返敬,文件擴(kuò)展名為 .npy :
arr = np.arange(10)
np.save('some_array', arr)
如果文件路進(jìn)并不是以 .npy 結(jié)尾,擴(kuò)展名將會(huì)被自動(dòng)加上。在磁盤上的數(shù)組可以使用 np.load 加載:
np.load('some_array.npy')
Out: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
可以使用 np.savez 并以關(guān)鍵字參數(shù)傳遞數(shù)組來保存多個(gè)數(shù)組到一個(gè)zip的歸檔文件中:
np.savez('array_archive.npz', a=arr, b=arr)
加載一個(gè) .npz 文件時(shí),會(huì)得到一個(gè)字典對(duì)象箫柳,該對(duì)象會(huì)對(duì)各個(gè)數(shù)組進(jìn)行延時(shí)加載:
arch = np.load('array_archive.npz')
arch['b']
Out: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
存取文本文件
從文件加載文本是一個(gè)相當(dāng)標(biāo)準(zhǔn)的任務(wù)。對(duì)一個(gè)新人來說啥供,Python的文件加讀取和寫入函數(shù)的景象可能有一點(diǎn)兒混亂,因此我將主要集中在pandas的 read_csv 和 read_table 函數(shù)上库糠。有時(shí)使用 np.loadtxt 或更專門的 np.genfromtxt 對(duì)于加載數(shù)據(jù)到普通的 NumPy 數(shù)組是很有用的伙狐。
# Windows下用type
!cat array_ex.txt
0.580052,0.186730,1.040717,1.134411
0.194163,-0.636917,-0.938659,0.124094
-0.126410,0.268607,-0.695724,0.047428
-1.484413,0.004176,-0.744203,0.005487
2.302869,0.200131,1.670238,-1.881090
-0.193230,1.047233,0.482803,0.960334
# 直接將文件加載到一個(gè)二維數(shù)組中
arr = np.loadtxt('array_ex.txt', delimiter=',')
arr
Out:
array([[ 0.5801, 0.1867, 1.0407, 1.1344],
[ 0.1942, -0.6369, -0.9387, 0.1241],
[-0.1264, 0.2686, -0.6957, 0.0474],
[-1.4844, 0.0042, -0.7442, 0.0055],
[ 2.3029, 0.2001, 1.6702, -1.8811],
[-0.1932, 1.0472, 0.4828, 0.9603]])
np.savatxt 執(zhí)行相反的操作:將數(shù)組寫到以某種分隔符隔開的文本文件中。 genfromtxt 與 loadtxt 相似瞬欧,但是它是面向結(jié)構(gòu)數(shù)組和缺失數(shù)據(jù)處理的贷屎。
線性代數(shù)
dot 函數(shù),是數(shù)組的一個(gè)方法和 numpy 命名空間中的一個(gè)函數(shù)艘虎,用來進(jìn)行矩陣乘法運(yùn)算:
x = np.array([[1., 2., 3.], [4., 5., 6.]])
In [195]: y = np.array([[6., 23.], [-1, 7], [8, 9]])
x.dot(y) # 等價(jià)于 np.dot(x, y)
Out:
array([[ 28., 64.],
[ 67., 181.]])
numpy.linalg 有一個(gè)關(guān)于矩陣分解和像轉(zhuǎn)置和行列式等的一個(gè)標(biāo)準(zhǔn)集合唉侄。
from numpy.linalg import inv, qr
常見numpy.linalg
函數(shù) | 描述 |
---|---|
diag | 返回一個(gè)方陣的對(duì)角線(或非對(duì)角線)元素為一個(gè)一維數(shù)組,或者轉(zhuǎn)換一個(gè)一維數(shù)組到一個(gè)方陣(非對(duì)角線元素為零) |
dot | 矩陣乘積 |
trace | 計(jì)算對(duì)角線上元素的和 |
det | 計(jì)算矩陣行列式 |
eig | 計(jì)算方陣的特征值和特征向量 |
inv | 計(jì)算方陣的逆 |
pinv | 計(jì)算方陣 Moore-Penrose 偽逆 |
qr | 計(jì)算 QR 分解 |
svd | 計(jì)算奇異值分解(SVD) |
solve | 求解線性系統(tǒng)方程 Ax = b 的x野建,其中A是一個(gè)方陣 |
lstsq | 計(jì)算 y = Xb 的最小二乘解 |
隨機(jī)數(shù)生成
numpy.random 模塊對(duì) Python 內(nèi)置的 random 進(jìn)行了補(bǔ)充属划,增加了一些用于高效生成多種概率分布的樣本值得函數(shù)恬叹。
numpy.random 函數(shù)
函數(shù) | 說明 |
---|---|
seed | 確定隨機(jī)數(shù)生成數(shù)的種子 |
permutation | 返回一個(gè)序列的隨機(jī)排列或返回一個(gè)隨機(jī)排列的范圍 |
shuffle | 對(duì)一個(gè)序列就地隨機(jī)排列 |
rand | 產(chǎn)生均勻分布的樣本值 |
randint | 從給定的上下限范圍內(nèi)(不包括上限)隨機(jī)選取整數(shù) |
randn | 產(chǎn)生標(biāo)準(zhǔn)正態(tài)分布的樣本值 |
binomial | 產(chǎn)生二項(xiàng)分布的樣本值 |
normal | 產(chǎn)生正態(tài)(高斯)分布的樣本值 |
beta | 產(chǎn)生Beta分布的樣本值 |
chisquare | 產(chǎn)生卡方分布的樣本值 |
gamma | 產(chǎn)生Gamma分布的樣本值 |
uniform | 產(chǎn)生在[0,1]中均勻分布的樣本值 |
模擬隨機(jī)漫步
多個(gè)隨機(jī)漫步
nwalks = 5000
nsteps = 1000
draws = np.random.randint(0, 2, size=(nwalks, nsteps)) # 0 or 1
steps = np.where(draws > 0, 1, -1)
walks = steps.cumsum(1)
walks
Out:
array([[ 1, 0, 1, ..., 8, 7, 8],
[ 1, 0, -1, ..., 34, 33, 32],
[ 1, 0, -1, ..., 4, 5, 4],
...,
[ 1, 2, 1, ..., 24, 25, 26],
[ 1, 2, 3, ..., 14, 13, 14],
[ -1, -2, -3, ..., -24, -23, -22]])
# 我們可以獲得所有游走的最大和最小值
walks.max() In [229]: walks.min()
Out: 138 Out[229]: -133
# 在這些游走中,讓我們來計(jì)算到達(dá)30或-30的最短時(shí)間同眯。這有一點(diǎn)兒狡猾绽昼,
# 因?yàn)椴皇撬械?000個(gè)游走都能到達(dá)30。我們可以使用 any 方法來檢測(cè)
hits30 = (np.abs(walks) >= 30).any(1)
hits30
Out: array([False, True, False, ..., False, True, False], dtype=bool)
hits30.sum() # 30或-30的個(gè)數(shù)
Out: 3410
# 我們可以使用這個(gè)布爾數(shù)組來選擇這些游走中跨過絕對(duì)值30的行须蜗,并調(diào)用 argmax 來取得坐標(biāo)軸1的穿越時(shí)間:
crossing_times = (np.abs(walks[hits30]) >= 30).argmax(1)
crossing_times.mean()
Out[234]: 498.88973607038122