NumPy 基礎(chǔ):數(shù)組和矢量計(jì)算

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硅确,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子明肮,更是在濱河造成了極大的恐慌菱农,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柿估,死亡現(xiàn)場(chǎng)離奇詭異大莫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)官份,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門只厘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舅巷,你說我怎么就攤上這事羔味。” “怎么了钠右?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵赋元,是天一觀的道長。 經(jīng)常有香客問我飒房,道長搁凸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任狠毯,我火速辦了婚禮护糖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嚼松。我一直安慰自己嫡良,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布献酗。 她就那樣靜靜地躺著寝受,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罕偎。 梳的紋絲不亂的頭發(fā)上很澄,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼甩苛。 笑死蹂楣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浪藻。 我是一名探鬼主播捐迫,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼爱葵!你這毒婦竟也來了施戴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤萌丈,失蹤者是張志新(化名)和其女友劉穎赞哗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辆雾,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肪笋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了度迂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藤乙。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惭墓,靈堂內(nèi)的尸體忽然破棺而出坛梁,到底是詐尸還是另有隱情,我是刑警寧澤腊凶,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布划咐,位于F島的核電站,受9級(jí)特大地震影響钧萍,放射性物質(zhì)發(fā)生泄漏褐缠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一风瘦、第九天 我趴在偏房一處隱蔽的房頂上張望队魏。 院中可真熱鬧,春花似錦弛秋、人聲如沸器躏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至遏佣,卻和暖如春挖炬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背状婶。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工意敛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馅巷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓草姻,卻偏偏與公主長得像钓猬,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撩独,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容