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)建長(zhǎng)度為10的全0數(shù)組
np.ones(10)  #創(chuàng)建長(zhǎ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ù)組的長(zhǎng)度必須跟被索引的軸長(zhǎng)度一致。還可以跟切片、整數(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è)軸向上的元素求和。零長(zhǎng)度的數(shù)組的和為靈。
mean 算術(shù)平均值。靈長(zhǎng)度的數(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容