摘要:注意和標(biāo)準(zhǔn)庫類并不相同,后者只處理一維數(shù)組和提供少量功能。然而,指定參數(shù)你可以吧運(yùn)算應(yīng)用到數(shù)組指定的軸上通用函數(shù)提供常見的數(shù)學(xué)函數(shù)如和。在中,這些叫作通用函數(shù)。函數(shù),另一方面,將一維數(shù)組以行組合成二維數(shù)組。
2.1 先決條件原文:Quickstart tutorial
譯者:Reverland
來源:試驗(yàn)性NumPy教程(譯)
在閱讀這個(gè)教程之前,你多少需要知道點(diǎn)python。如果你想重新回憶下,請看看Python Tutorial.
如果你想要運(yùn)行教程中的示例,你至少需要在你的電腦上安裝了以下一些軟件:
Python
NumPy
這些是可能對(duì)你有幫助的:
ipython是一個(gè)凈強(qiáng)化的交互Python Shell,對(duì)探索NumPy的特性非常方便。
matplotlib將允許你繪圖
Scipy在NumPy的基礎(chǔ)上提供了很多科學(xué)模塊
2.2 基礎(chǔ)篇NumPy的主要對(duì)象是同種元素的多維數(shù)組。這是一個(gè)所有的元素都是一種類型、通過一個(gè)正整數(shù)元組索引的元素表格(通常是元素是數(shù)字)。在NumPy中維度(dimensions)叫做軸(axes),軸的個(gè)數(shù)叫做秩(rank)。
例如,在3D空間一個(gè)點(diǎn)的坐標(biāo)[1, 2, 3]是一個(gè)秩為1的數(shù)組,因?yàn)樗挥幸粋€(gè)軸。那個(gè)軸長度為3.又例如,在以下例子中,數(shù)組的秩為2(它有兩個(gè)維度).第一個(gè)維度長度為2,第二個(gè)維度長度為3.
[[ 1., 0., 0.], [ 0., 1., 2.]]
NumPy的數(shù)組類被稱作_ndarray_。通常被稱作數(shù)組。注意numpy.array和標(biāo)準(zhǔn)Python庫類array.array并不相同,后者只處理一維數(shù)組和提供少量功能。更多重要ndarray對(duì)象屬性有:
ndarray.ndim
數(shù)組軸的個(gè)數(shù),在python的世界中,軸的個(gè)數(shù)被稱作秩
ndarray.shape
數(shù)組的維度。這是一個(gè)指示數(shù)組在每個(gè)維度上大小的整數(shù)元組。例如一個(gè)n排m列的矩陣,它的shape屬性將是(2,3),這個(gè)元組的長度顯然是秩,即維度或者ndim屬性
ndarray.size
數(shù)組元素的總個(gè)數(shù),等于shape屬性中元組元素的乘積。
ndarray.dtype
一個(gè)用來描述數(shù)組中元素類型的對(duì)象,可以通過創(chuàng)造或指定dtype使用標(biāo)準(zhǔn)Python類型。另外NumPy提供它自己的數(shù)據(jù)類型。
ndarray.itemsize
數(shù)組中每個(gè)元素的字節(jié)大小。例如,一個(gè)元素類型為float64的數(shù)組itemsiz屬性值為8(=64/8),又如,一個(gè)元素類型為complex32的數(shù)組item屬性為4(=32/8).
ndarray.data
包含實(shí)際數(shù)組元素的緩沖區(qū),通常我們不需要使用這個(gè)屬性,因?yàn)槲覀兛偸峭ㄟ^索引來使用數(shù)組中的元素。一個(gè)例子[1](在python的交互環(huán)境或ipython中)
>>> from numpy import * >>> a = arange(15).reshape(3, 5) >>> a array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) >>> a.shape (3, 5) >>> a.ndim 2 >>> a.dtype.name "int32" >>> a.itemsize 4 >>> a.size 15 >>> type(a) numpy.ndarray >>> b = array([6, 7, 8]) >>> b array([6, 7, 8]) >>> type(b) numpy.ndarray創(chuàng)建數(shù)組
有好幾種創(chuàng)建數(shù)組的方法。
例如,你可以使用array函數(shù)從常規(guī)的Python列表和元組創(chuàng)造數(shù)組。所創(chuàng)建的數(shù)組類型由原序列中的元素類型推導(dǎo)而來。
>>> from numpy import * >>> a = array( [2,3,4] ) >>> a array([2, 3, 4]) >>> a.dtype dtype("int32") >>> b = array([1.2, 3.5, 5.1]) >>> b.dtype dtype("float64")
一個(gè)常見的錯(cuò)誤包括用多個(gè)數(shù)值參數(shù)調(diào)用array而不是提供一個(gè)由數(shù)值組成的列表作為一個(gè)參數(shù)。
>>> a = array(1,2,3,4) # WRONG >>> a = array([1,2,3,4]) # RIGHT
數(shù)組將序列包含序列轉(zhuǎn)化成二維的數(shù)組,序列包含序列包含序列轉(zhuǎn)化成三維數(shù)組等等。
>>> b = array( [ (1.5,2,3), (4,5,6) ] ) >>> b array([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]])
數(shù)組類型可以在創(chuàng)建時(shí)顯示指定
>>> c = array( [ [1,2], [3,4] ], dtype=complex ) >>> c array([[ 1.+0.j, 2.+0.j], [ 3.+0.j, 4.+0.j]])
通常,數(shù)組的元素開始都是未知的,但是它的大小已知。因此,NumPy提供了一些使用占位符創(chuàng)建數(shù)組的函數(shù)。這最小化了擴(kuò)展數(shù)組的需要和高昂的運(yùn)算代價(jià)。
函數(shù)function創(chuàng)建一個(gè)全是0的數(shù)組,函數(shù)ones創(chuàng)建一個(gè)全1的數(shù)組,函數(shù)empty創(chuàng)建一個(gè)內(nèi)容隨機(jī)并且依賴與內(nèi)存狀態(tài)的數(shù)組。默認(rèn)創(chuàng)建的數(shù)組類型(dtype)都是float64。
>>> zeros( (3,4) ) array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]) >>> ones( (2,3,4), dtype=int16 ) # dtype can also be specified array([[[ 1, 1, 1, 1], [ 1, 1, 1, 1], [ 1, 1, 1, 1]], [[ 1, 1, 1, 1], [ 1, 1, 1, 1], [ 1, 1, 1, 1]]], dtype=int16) >>> empty( (2,3) ) array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260], [ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
為了創(chuàng)建一個(gè)數(shù)列,NumPy提供一個(gè)類似arange的函數(shù)返回?cái)?shù)組而不是列表:
>>> arange( 10, 30, 5 ) array([10, 15, 20, 25]) >>> arange( 0, 2, 0.3 ) # it accepts float arguments array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
當(dāng)arange使用浮點(diǎn)數(shù)參數(shù)時(shí),由于有限的浮點(diǎn)數(shù)精度,通常無法預(yù)測獲得的元素個(gè)數(shù)。因此,最好使用函數(shù)linspace去接收我們想要的元素個(gè)數(shù)來代替用range來指定步長。
其它函數(shù)array, zeros, zeros_like, ones, ones_like, empty, empty_like, arange, linspace, rand, randn, fromfunction, fromfile參考:NumPy示例
打印數(shù)組當(dāng)你打印一個(gè)數(shù)組,NumPy以類似嵌套列表的形式顯示它,但是呈以下布局:
最后的軸從左到右打印
次后的軸從頂向下打印
剩下的軸從頂向下打印,每個(gè)切片通過一個(gè)空行與下一個(gè)隔開
一維數(shù)組被打印成行,二維數(shù)組成矩陣,三維數(shù)組成矩陣列表。
>>> a = arange(6) # 1d array >>> print a [0 1 2 3 4 5] >>> >>> b = arange(12).reshape(4,3) # 2d array >>> print b [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] >>> >>> c = arange(24).reshape(2,3,4) # 3d array >>> print c [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]]
查看形狀操作一節(jié)獲得有關(guān)reshape的更多細(xì)節(jié)
如果一個(gè)數(shù)組用來打印太大了,NumPy自動(dòng)省略中間部分而只打印角落
>>> print arange(10000) [ 0 1 2 ..., 9997 9998 9999] >>> >>> print arange(10000).reshape(100,100) [[ 0 1 2 ..., 97 98 99] [ 100 101 102 ..., 197 198 199] [ 200 201 202 ..., 297 298 299] ..., [9700 9701 9702 ..., 9797 9798 9799] [9800 9801 9802 ..., 9897 9898 9899] [9900 9901 9902 ..., 9997 9998 9999]]
禁用NumPy的這種行為并強(qiáng)制打印整個(gè)數(shù)組,你可以設(shè)置printoptions參數(shù)來更改打印選項(xiàng)。
>>> set_printoptions(threshold="nan")基本運(yùn)算
數(shù)組的算術(shù)運(yùn)算是按元素的。新的數(shù)組被創(chuàng)建并且被結(jié)果填充。
>>> a = array( [20,30,40,50] ) >>> b = arange( 4 ) >>> b array([0, 1, 2, 3]) >>> c = a-b >>> c array([20, 29, 38, 47]) >>> b**2 array([0, 1, 4, 9]) >>> 10*sin(a) array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854]) >>> a<35 array([True, True, False, False], dtype=bool)
不像許多矩陣語言,NumPy中的乘法運(yùn)算符*指示按元素計(jì)算,矩陣乘法可以使用dot函數(shù)或創(chuàng)建矩陣對(duì)象實(shí)現(xiàn)(參見教程中的矩陣章節(jié))
>>> A = array( [[1,1], ... [0,1]] ) >>> B = array( [[2,0], ... [3,4]] ) >>> A*B # elementwise product array([[2, 0], [0, 4]]) >>> dot(A,B) # matrix product array([[5, 4], [3, 4]])
有些操作符像+=和*=被用來更改已存在數(shù)組而不創(chuàng)建一個(gè)新的數(shù)組。
>>> a = ones((2,3), dtype=int) >>> b = random.random((2,3)) >>> a *= 3 >>> a array([[3, 3, 3], [3, 3, 3]]) >>> b += a >>> b array([[ 3.69092703, 3.8324276 , 3.0114541 ], [ 3.18679111, 3.3039349 , 3.37600289]]) >>> a += b # b is converted to integer type >>> a array([[6, 6, 6], [6, 6, 6]])
當(dāng)運(yùn)算的是不同類型的數(shù)組時(shí),結(jié)果數(shù)組和更普遍和精確的已知(這種行為叫做upcast)。
>>> a = ones(3, dtype=int32) >>> b = linspace(0,pi,3) >>> b.dtype.name "float64" >>> c = a+b >>> c array([ 1. , 2.57079633, 4.14159265]) >>> c.dtype.name "float64" >>> d = exp(c*1j) >>> d array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j, -0.54030231-0.84147098j]) >>> d.dtype.name "complex128"
許多非數(shù)組運(yùn)算,如計(jì)算數(shù)組所有元素之和,被作為ndarray類的方法實(shí)現(xiàn)
>>> a = random.random((2,3)) >>> a array([[ 0.6903007 , 0.39168346, 0.16524769], [ 0.48819875, 0.77188505, 0.94792155]]) >>> a.sum() 3.4552372100521485 >>> a.min() 0.16524768654743593 >>> a.max() 0.9479215542670073
這些運(yùn)算默認(rèn)應(yīng)用到數(shù)組好像它就是一個(gè)數(shù)字組成的列表,無關(guān)數(shù)組的形狀。然而,指定axis參數(shù)你可以吧運(yùn)算應(yīng)用到數(shù)組指定的軸上:
>>> b = arange(12).reshape(3,4) >>> b array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> >>> b.sum(axis=0) # sum of each column array([12, 15, 18, 21]) >>> >>> b.min(axis=1) # min of each row array([0, 4, 8]) >>> >>> b.cumsum(axis=1) # cumulative sum along each row array([[ 0, 1, 3, 6], [ 4, 9, 15, 22], [ 8, 17, 27, 38]])通用函數(shù)(ufunc)
NumPy提供常見的數(shù)學(xué)函數(shù)如sin,cos和exp。在NumPy中,這些叫作“通用函數(shù)”(ufunc)。在NumPy里這些函數(shù)作用按數(shù)組的元素運(yùn)算,產(chǎn)生一個(gè)數(shù)組作為輸出。
>>> B = arange(3) >>> B array([0, 1, 2]) >>> exp(B) array([ 1. , 2.71828183, 7.3890561 ]) >>> sqrt(B) array([ 0. , 1. , 1.41421356]) >>> C = array([2., -1., 4.]) >>> add(B, C) array([ 2., 0., 6.])
更多函數(shù)all, alltrue, any, apply along axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, conjugate, corrcoef, cov, cross, cumprod, cumsum, diff, dot, floor, inner, inv, lexsort, max, maximum, mean, median, min, minimum, nonzero, outer, prod, re, round, sometrue, sort, std, sum, trace, transpose, var, vdot, vectorize, where 參見:NumPy示例
索引,切片和迭代_一維_數(shù)組可以被索引、切片和迭代,就像列表和其它Python序列。
>>> a = arange(10)**3 >>> a array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]) >>> a[2] 8 >>> a[2:5] array([ 8, 27, 64]) >>> a[:6:2] = -1000 # equivalent to a[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to -1000 >>> a array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729]) >>> a[ : :-1] # reversed a array([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1, -1000]) >>> for i in a: ... print i**(1/3.), ... nan 1.0 nan 3.0 nan 5.0 6.0 7.0 8.0 9.0
_多維_數(shù)組可以每個(gè)軸有一個(gè)索引。這些索引由一個(gè)逗號(hào)分割的元組給出。
>>> def f(x,y): ... return 10*x+y ... >>> b = fromfunction(f,(5,4),dtype=int) >>> b array([[ 0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33], [40, 41, 42, 43]]) >>> b[2,3] 23 >>> b[0:5, 1] # each row in the second column of b array([ 1, 11, 21, 31, 41]) >>> b[ : ,1] # equivalent to the previous example array([ 1, 11, 21, 31, 41]) >>> b[1:3, : ] # each column in the second and third row of b array([[10, 11, 12, 13], [20, 21, 22, 23]])
當(dāng)少于軸數(shù)的索引被提供時(shí),確失的索引被認(rèn)為是整個(gè)切片:
>>> b[-1] # the last row. Equivalent to b[-1,:] array([40, 41, 42, 43])
b[i]中括號(hào)中的表達(dá)式被當(dāng)作i和一系列:,來代表剩下的軸。NumPy也允許你使用“點(diǎn)”像b[i,...]。
_點(diǎn)_(…)代表許多產(chǎn)生一個(gè)完整的索引元組必要的分號(hào)。如果x是秩為5的數(shù)組(即它有5個(gè)軸),那么:
x[1,2,…] 等同于 x[1,2,:,:,:],
x[…,3] 等同于 x[:,:,:,:,3]
x[4,…,5,:] 等同 x[4,:,:,5,:].
>>> c = array( [ [[ 0, 1, 2], # a 3D array (two stacked 2D arrays) ... [ 10, 12, 13]], ... ... [[100,101,102], ... [110,112,113]] ] ) >>> c.shape (2, 2, 3) >>> c[1,...] # same as c[1,:,:] or c[1] array([[100, 101, 102], [110, 112, 113]]) >>> c[...,2] # same as c[:,:,2] array([[ 2, 13], [102, 113]])
_迭代_多維數(shù)組是就第一個(gè)軸而言的:[2](0軸)
>>> for row in b: ... print row ... [0 1 2 3] [10 11 12 13] [20 21 22 23] [30 31 32 33] [40 41 42 43]
然而,如果一個(gè)人想對(duì)每個(gè)數(shù)組中元素進(jìn)行運(yùn)算,我們可以使用flat屬性,該屬性是數(shù)組元素的一個(gè)迭代器:
>>> for element in b.flat: ... print element, ... 0 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43
更多], …, newaxis, ndenumerate, indices, index exp 參考[NumPy示例
2.3 形狀操作 更改數(shù)組的形狀一個(gè)數(shù)組的形狀由它每個(gè)軸上的元素個(gè)數(shù)給出:
>>> a = floor(10*random.random((3,4))) >>> a array([[ 7., 5., 9., 3.], [ 7., 2., 7., 8.], [ 6., 8., 3., 2.]]) >>> a.shape (3, 4)
一個(gè)數(shù)組的形狀可以被多種命令修改:
>>> a.ravel() # flatten the array array([ 7., 5., 9., 3., 7., 2., 7., 8., 6., 8., 3., 2.]) >>> a.shape = (6, 2) >>> a.transpose() array([[ 7., 9., 7., 7., 6., 3.], [ 5., 3., 2., 8., 8., 2.]])
由ravel()展平的數(shù)組元素的順序通常是“C風(fēng)格”的,就是說,最右邊的索引變化得最快,所以元素a[0,0]之后是a[0,1]。如果數(shù)組被改變形狀(reshape)成其它形狀,數(shù)組仍然是“C風(fēng)格”的。NumPy通常創(chuàng)建一個(gè)以這個(gè)順序保存數(shù)據(jù)的數(shù)組,所以ravel()將總是不需要復(fù)制它的參數(shù)[3](即self,它自己)。但是如果數(shù)組是通過切片其它數(shù)組或有不同尋常的選項(xiàng)時(shí),它可能需要被復(fù)制。函數(shù)reshape()和ravel()還可以被同過一些可選參數(shù)構(gòu)建成FORTRAN風(fēng)格的數(shù)組,即最左邊的索引變化最快。
reshape函數(shù)改變參數(shù)形狀并返回它,而resize函數(shù)改變數(shù)組自身。
>>> a array([[ 7., 5.], [ 9., 3.], [ 7., 2.], [ 7., 8.], [ 6., 8.], [ 3., 2.]]) >>> a.resize((2,6)) >>> a array([[ 7., 5., 9., 3., 7., 2.], [ 7., 8., 6., 8., 3., 2.]])
如果在改變形狀操作中一個(gè)維度被給做-1,其維度將自動(dòng)被計(jì)算
更多 shape, reshape, resize, ravel 參考NumPy示例
組合(stack)不同的數(shù)組幾種方法可以沿不同軸將數(shù)組堆疊在一起:
>>> a = floor(10*random.random((2,2))) >>> a array([[ 1., 1.], [ 5., 8.]]) >>> b = floor(10*random.random((2,2))) >>> b array([[ 3., 3.], [ 6., 0.]]) >>> vstack((a,b)) array([[ 1., 1.], [ 5., 8.], [ 3., 3.], [ 6., 0.]]) >>> hstack((a,b)) array([[ 1., 1., 3., 3.], [ 5., 8., 6., 0.]])
函數(shù)column_stack以列將一維數(shù)組合成二維數(shù)組,它等同與vstack對(duì)一維數(shù)組。
>>> column_stack((a,b)) # With 2D arrays array([[ 1., 1., 3., 3.], [ 5., 8., 6., 0.]]) >>> a=array([4.,2.]) >>> b=array([2.,8.]) >>> a[:,newaxis] # This allows to have a 2D columns vector array([[ 4.], [ 2.]]) >>> column_stack((a[:,newaxis],b[:,newaxis])) array([[ 4., 2.], [ 2., 8.]]) >>> vstack((a[:,newaxis],b[:,newaxis])) # The behavior of vstack is different array([[ 4.], [ 2.], [ 2.], [ 8.]])
row_stack函數(shù),另一方面,將一維數(shù)組以行組合成二維數(shù)組。
對(duì)那些維度比二維更高的數(shù)組,hstack沿著第二個(gè)軸組合,vstack沿著第一個(gè)軸組合,concatenate允許可選參數(shù)給出組合時(shí)沿著的軸。
Note
在復(fù)雜情況下,r_[]和c_[]對(duì)創(chuàng)建沿著一個(gè)方向組合的數(shù)很有用,它們允許范圍符號(hào)(“:”):
>>> r_[1:4,0,4] array([1, 2, 3, 0, 4])
當(dāng)使用數(shù)組作為參數(shù)時(shí),r_和c_的默認(rèn)行為和vstack和hstack很像,但是允許可選的參數(shù)給出組合所沿著的軸的代號(hào)。
更多函數(shù)hstack , vstack, column_stack , row_stack , concatenate , c_ , r_
參見NumPy示例.
使用hsplit你能將數(shù)組沿著它的水平軸分割,或者指定返回相同形狀數(shù)組的個(gè)數(shù),或者指定在哪些列后發(fā)生分割:
>>> a = floor(10*random.random((2,12))) >>> a array([[ 8., 8., 3., 9., 0., 4., 3., 0., 0., 6., 4., 4.], [ 0., 3., 2., 9., 6., 0., 4., 5., 7., 5., 1., 4.]]) >>> hsplit(a,3) # Split a into 3 [array([[ 8., 8., 3., 9.], [ 0., 3., 2., 9.]]), array([[ 0., 4., 3., 0.], [ 6., 0., 4., 5.]]), array([[ 0., 6., 4., 4.], [ 7., 5., 1., 4.]])] >>> hsplit(a,(3,4)) # Split a after the third and the fourth column [array([[ 8., 8., 3.], [ 0., 3., 2.]]), array([[ 9.], [ 9.]]), array([[ 0., 4., 3., 0., 0., 6., 4., 4.], [ 6., 0., 4., 5., 7., 5., 1., 4.]])]
vsplit沿著縱向的軸分割,array split允許指定沿哪個(gè)軸分割。
2.4 復(fù)制和視圖當(dāng)運(yùn)算和處理數(shù)組時(shí),它們的數(shù)據(jù)有時(shí)被拷貝到新的數(shù)組有時(shí)不是。這通常是新手的困惑之源。這有三種情況:
完全不拷貝簡單的賦值不拷貝數(shù)組對(duì)象或它們的數(shù)據(jù)。
>>> a = arange(12) >>> b = a # no new object is created >>> b is a # a and b are two names for the same ndarray object True >>> b.shape = 3,4 # changes the shape of a >>> a.shape (3, 4)
Python 傳遞不定對(duì)象作為參考[4](形參),所以函數(shù)調(diào)用不拷貝數(shù)組。
>>> def f(x): ... print id(x) ... >>> id(a) # id is a unique identifier of an object 148293216 >>> f(a) 148293216視圖(view)和淺復(fù)制
不同的數(shù)組對(duì)象分享同一個(gè)數(shù)據(jù)。視圖方法創(chuàng)造一個(gè)新的數(shù)組對(duì)象指向同一數(shù)據(jù)。
>>> c = a.view() >>> c is a False >>> c.base is a # c is a view of the data owned by a True >>> c.flags.owndata False >>> >>> c.shape = 2,6 # a"s shape doesn"t change >>> a.shape (3, 4) >>> c[0,4] = 1234 # a"s data changes >>> a array([[ 0, 1, 2, 3], [1234, 5, 6, 7], [ 8, 9, 10, 11]])
切片數(shù)組返回它的一個(gè)視圖:
>>> 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]])深復(fù)制
這個(gè)復(fù)制方法完全復(fù)制數(shù)組和它的數(shù)據(jù)。
>>> d = a.copy() # a new array object with new data is created >>> d is a False >>> d.base is a # d doesn"t share anything with a False >>> d[0,0] = 9999 >>> a array([[ 0, 10, 10, 3], [1234, 10, 10, 7], [ 8, 10, 10, 11]])函數(shù)和方法(method)總覽
這是個(gè)NumPy函數(shù)和方法分類排列目錄。這些名字鏈接到NumPy示例,你可以看到這些函數(shù)起作用。[5](0軸)
創(chuàng)建數(shù)組
arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, ones_like, r , zeros, zeros_like
轉(zhuǎn)化
astype, atleast 1d, atleast 2d, atleast 3d, mat
操作
array split, column stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, item, newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack
詢問
all, any, nonzero, where
排序
argmax, argmin, argsort, max, min, ptp, searchsorted, sort
運(yùn)算
choose, compress, cumprod, cumsum, inner, fill, imag, prod, put, putmask, real, sum
基本統(tǒng)計(jì)
cov, mean, std, var
基本線性代數(shù)
cross, dot, outer, svd, vdot2.5 進(jìn)階 廣播法則(rule)
廣播法則能使通用函數(shù)有意義地處理不具有相同形狀的輸入。
廣播第一法則是,如果所有的輸入數(shù)組維度不都相同,一個(gè)“1”將被重復(fù)地添加在維度較小的數(shù)組上直至所有的數(shù)組擁有一樣的維度。
廣播第二法則確定長度為1的數(shù)組沿著特殊的方向表現(xiàn)地好像它有沿著那個(gè)方向最大形狀的大小。對(duì)數(shù)組來說,沿著那個(gè)維度的數(shù)組元素的值理應(yīng)相同。
應(yīng)用廣播法則之后,所有數(shù)組的大小必須匹配。更多細(xì)節(jié)可以從這個(gè)文檔找到。
2.6 花哨的索引和索引技巧NumPy比普通Python序列提供更多的索引功能。除了索引整數(shù)和切片,正如我們之前看到的,數(shù)組可以被整數(shù)數(shù)組和布爾數(shù)組索引。
通過數(shù)組索引>>> a = arange(12)**2 # the first 12 square numbers >>> i = array( [ 1,1,3,8,5 ] ) # an array of indices >>> a[i] # the elements of a at the positions i array([ 1, 1, 9, 64, 25]) >>> >>> j = array( [ [ 3, 4], [ 9, 7 ] ] ) # a bidimensional array of indices >>> a[j] # the same shape as j array([[ 9, 16], [81, 49]])
當(dāng)被索引數(shù)組a是多維的時(shí),每一個(gè)唯一的索引數(shù)列指向a的第一維[5](0軸)。以下示例通過將圖片標(biāo)簽用調(diào)色版轉(zhuǎn)換成色彩圖像展示了這種行為。
>>> palette = array( [ [0,0,0], # black ... [255,0,0], # red ... [0,255,0], # green ... [0,0,255], # blue ... [255,255,255] ] ) # white >>> image = array( [ [ 0, 1, 2, 0 ], # each value corresponds to a color in the palette ... [ 0, 3, 4, 0 ] ] ) >>> palette[image] # the (2,4,3) color image array([[[ 0, 0, 0], [255, 0, 0], [ 0, 255, 0], [ 0, 0, 0]], [[ 0, 0, 0], [ 0, 0, 255], [255, 255, 255], [ 0, 0, 0]]])
我們也可以給出不不止一維的索引,每一維的索引數(shù)組必須有相同的形狀。
>>> a = arange(12).reshape(3,4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> i = array( [ [0,1], # indices for the first dim of a ... [1,2] ] ) >>> j = array( [ [2,1], # indices for the second dim ... [3,3] ] ) >>> >>> a[i,j] # i and j must have equal shape array([[ 2, 5], [ 7, 11]]) >>> >>> a[i,2] array([[ 2, 6], [ 6, 10]]) >>> >>> a[:,j] # i.e., a[ : , j] array([[[ 2, 1], [ 3, 3]], [[ 6, 5], [ 7, 7]], [[10, 9], [11, 11]]])
自然,我們可以把i和j放到序列中(比如說列表)然后通過list索引。
>>> l = [i,j] >>> a[l] # equivalent to a[i,j] array([[ 2, 5], [ 7, 11]])
然而,我們不能把i和j放在一個(gè)數(shù)組中,因?yàn)檫@個(gè)數(shù)組將被解釋成索引a的第一維。
>>> s = array( [i,j] ) >>> a[s] # not what we want --------------------------------------------------------------------------- IndexError Traceback (most recent call last)in () ----> 1 a[s] IndexError: index (3) out of range (0<=index<2) in dimension 0 >>> >>> a[tuple(s)] # same as a[i,j] array([[ 2, 5], [ 7, 11]])
另一個(gè)常用的數(shù)組索引用法是搜索時(shí)間序列最大值[6](我也不知道在翻譯什么了……)。
>>> time = linspace(20, 145, 5) # time scale >>> data = sin(arange(20)).reshape(5,4) # 4 time-dependent series >>> time array([ 20. , 51.25, 82.5 , 113.75, 145. ]) >>> data array([[ 0. , 0.84147098, 0.90929743, 0.14112001], [-0.7568025 , -0.95892427, -0.2794155 , 0.6569866 ], [ 0.98935825, 0.41211849, -0.54402111, -0.99999021], [-0.53657292, 0.42016704, 0.99060736, 0.65028784], [-0.28790332, -0.96139749, -0.75098725, 0.14987721]]) >>> >>> ind = data.argmax(axis=0) # index of the maxima for each series >>> ind array([2, 0, 3, 1]) >>> >>> time_max = time[ ind] # times corresponding to the maxima >>> >>> data_max = data[ind, xrange(data.shape[1])] # => data[ind[0],0], data[ind[1],1]... >>> >>> time_max array([ 82.5 , 20. , 113.75, 51.25]) >>> data_max array([ 0.98935825, 0.84147098, 0.99060736, 0.6569866 ]) >>> >>> all(data_max == data.max(axis=0)) True
你也可以使用數(shù)組索引作為目標(biāo)來賦值:
>>> a = arange(5) >>> a array([0, 1, 2, 3, 4]) >>> a[[1,3,4]] = 0 >>> a array([0, 0, 2, 0, 0])
然而,當(dāng)一個(gè)索引列表包含重復(fù)時(shí),賦值被多次完成,保留最后的值:
>>> a = arange(5) >>> a[[0,0,2]]=[1,2,3] >>> a array([2, 1, 3, 3, 4])
這足夠合理,但是小心如果你想用Python的+=結(jié)構(gòu),可能結(jié)果并非你所期望:
>>> a = arange(5) >>> a[[0,0,2]]+=1 >>> a array([1, 1, 3, 3, 4])
即使0在索引列表中出現(xiàn)兩次,索引為0的元素僅僅增加一次。這是因?yàn)镻ython要求a+=1和a=a+1等同。
通過布爾數(shù)組索引當(dāng)我們使用整數(shù)數(shù)組索引數(shù)組時(shí),我們提供一個(gè)索引列表去選擇。通過布爾數(shù)組索引的方法是不同的我們顯式地選擇數(shù)組中我們想要和不想要的元素。
我們能想到的使用布爾數(shù)組的索引最自然方式就是使用和原數(shù)組一樣形狀的布爾數(shù)組。
>>> a = arange(12).reshape(3,4) >>> b = a > 4 >>> b # b is a boolean with a"s shape array([[False, False, False, False], [False, True, True, True], [True, True, True, True]], dtype=bool) >>> a[b] # 1d array with the selected elements array([ 5, 6, 7, 8, 9, 10, 11])
這個(gè)屬性在賦值時(shí)非常有用:
>>> a[b] = 0 # All elements of "a" higher than 4 become 0 >>> a array([[0, 1, 2, 3], [4, 0, 0, 0], [0, 0, 0, 0]])
你可以參考曼德博集合示例看看如何使用布爾索引來生成曼德博集合的圖像。
第二種通過布爾來索引的方法更近似于整數(shù)索引;對(duì)數(shù)組的每個(gè)維度我們給一個(gè)一維布爾數(shù)組來選擇我們想要的切片。
>>> a = arange(12).reshape(3,4) >>> b1 = array([False,True,True]) # first dim selection >>> b2 = array([True,False,True,False]) # second dim selection >>> >>> a[b1,:] # selecting rows array([[ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> >>> a[b1] # same thing array([[ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> >>> a[:,b2] # selecting columns array([[ 0, 2], [ 4, 6], [ 8, 10]]) >>> >>> a[b1,b2] # a weird thing to do array([ 4, 10])
注意一維數(shù)組的長度必須和你想要切片的維度或軸的長度一致,在之前的例子中,b1是一個(gè)秩為1長度為三的數(shù)組(a的行數(shù)),b2(長度為4)與a的第二秩(列)相一致。[7](上面最后一個(gè)例子,b1和b2中的true個(gè)數(shù)必須一致)
ix_()函數(shù)ix_函數(shù)可以為了獲得多元組的結(jié)果而用來結(jié)合不同向量。例如,如果你想要用所有向量a、b和c元素組成的三元組來計(jì)算a+b*c:
>>> a = array([2,3,4,5]) >>> b = array([8,5,4]) >>> c = array([5,4,6,8,3]) >>> ax,bx,cx = ix_(a,b,c) >>> ax array([[[2]], [[3]], [[4]], [[5]]]) >>> bx array([[[8], [5], [4]]]) >>> cx array([[[5, 4, 6, 8, 3]]]) >>> ax.shape, bx.shape, cx.shape ((4, 1, 1), (1, 3, 1), (1, 1, 5)) >>> result = ax+bx*cx >>> result array([[[42, 34, 50, 66, 26], [27, 22, 32, 42, 17], [22, 18, 26, 34, 14]], [[43, 35, 51, 67, 27], [28, 23, 33, 43, 18], [23, 19, 27, 35, 15]], [[44, 36, 52, 68, 28], [29, 24, 34, 44, 19], [24, 20, 28, 36, 16]], [[45, 37, 53, 69, 29], [30, 25, 35, 45, 20], [25, 21, 29, 37, 17]]]) >>> result[3,2,4] 17 >>> a[3]+b[2]*c[4] 17
你也可以實(shí)行如下簡化:
def ufunc_reduce(ufct, *vectors): vs = ix_(*vectors) r = ufct.identity for v in vs: r = ufct(r,v) return r
然后這樣使用它:
>>> ufunc_reduce(add,a,b,c) array([[[15, 14, 16, 18, 13], [12, 11, 13, 15, 10], [11, 10, 12, 14, 9]], [[16, 15, 17, 19, 14], [13, 12, 14, 16, 11], [12, 11, 13, 15, 10]], [[17, 16, 18, 20, 15], [14, 13, 15, 17, 12], [13, 12, 14, 16, 11]], [[18, 17, 19, 21, 16], [15, 14, 16, 18, 13], [14, 13, 15, 17, 12]]])
這個(gè)reduce與ufunc.reduce(比如說add.reduce)相比的優(yōu)勢在于它利用了廣播法則,避免了創(chuàng)建一個(gè)輸出大小乘以向量個(gè)數(shù)的參數(shù)數(shù)組。[8](我不怎么明白……總之避免創(chuàng)建一個(gè)很大的數(shù)組。)
用字符串索引參見RecordArray。
2.7 線性代數(shù)繼續(xù)前進(jìn),基本線性代數(shù)包含在這里。
簡單數(shù)組運(yùn)算參考numpy文件夾中的linalg.py獲得更多信息
>>> from numpy import * >>> from numpy.linalg import * >>> a = array([[1.0, 2.0], [3.0, 4.0]]) >>> print a [[ 1. 2.] [ 3. 4.]] >>> a.transpose() array([[ 1., 3.], [ 2., 4.]]) >>> inv(a) array([[-2. , 1. ], [ 1.5, -0.5]]) >>> u = eye(2) # unit 2x2 matrix; "eye" represents "I" >>> u array([[ 1., 0.], [ 0., 1.]]) >>> j = array([[0.0, -1.0], [1.0, 0.0]]) >>> dot (j, j) # matrix product array([[-1., 0.], [ 0., -1.]]) >>> trace(u) # trace 2.0 >>> y = array([[5.], [7.]]) >>> solve(a, y) array([[-3.], [ 4.]]) >>> eig(j) (array([ 0.+1.j, 0.-1.j]), array([[ 0.70710678+0.j, 0.70710678+0.j], [ 0.00000000-0.70710678j, 0.00000000+0.70710678j]])) Parameters: square matrix Returns The eigenvalues, each repeated according to its multiplicity. The normalized (unit "length") eigenvectors, such that the column ``v[:,i]`` is the eigenvector corresponding to the eigenvalue ``w[i]`` .矩陣類
這是一個(gè)關(guān)于矩陣類的簡短介紹。
>>> A = matrix("1.0 2.0; 3.0 4.0") >>> A [[ 1. 2.] [ 3. 4.]] >>> type(A) # file where class is defined索引:比較矩陣和二維數(shù)組>>> A.T # transpose [[ 1. 3.] [ 2. 4.]] >>> X = matrix("5.0 7.0") >>> Y = X.T >>> Y [[5.] [7.]] >>> print A*Y # matrix multiplication [[19.] [43.]] >>> print A.I # inverse [[-2. 1. ] [ 1.5 -0.5]] >>> solve(A, Y) # solving linear equation matrix([[-3.], [ 4.]])
注意NumPy中數(shù)組和矩陣有些重要的區(qū)別。NumPy提供了兩個(gè)基本的對(duì)象:一個(gè)N維數(shù)組對(duì)象和一個(gè)通用函數(shù)對(duì)象。其它對(duì)象都是建構(gòu)在它們之上的。特別的,矩陣是繼承自NumPy數(shù)組對(duì)象的二維數(shù)組對(duì)象。對(duì)數(shù)組和矩陣,索引都必須包含合適的一個(gè)或多個(gè)這些組合:整數(shù)標(biāo)量、省略號(hào)(ellipses)、整數(shù)列表;布爾值,整數(shù)或布爾值構(gòu)成的元組,和一個(gè)一維整數(shù)或布爾值數(shù)組。矩陣可以被用作矩陣的索引,但是通常需要數(shù)組、列表或者其它形式來完成這個(gè)任務(wù)。
像平常在Python中一樣,索引是從0開始的。傳統(tǒng)上我們用矩形的行和列表示一個(gè)二維數(shù)組或矩陣,其中沿著0軸的方向被穿過的稱作行,沿著1軸的方向被穿過的是列。[9](水平是1軸,垂直是0軸。)
讓我們創(chuàng)建數(shù)組和矩陣用來切片:
>>> A = arange(12) >>> A array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> A.shape = (3,4) >>> M = mat(A.copy()) >>> print type(A)," ",type(M)>>> print A [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] >>> print M [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
現(xiàn)在,讓我們簡單的切幾片?;镜那衅褂们衅瑢?duì)象或整數(shù)。例如,A[:]和M[:]的求值將表現(xiàn)得和Python索引很相似。然而要注意很重要的一點(diǎn)就是NumPy切片數(shù)組_不_創(chuàng)建數(shù)據(jù)的副本;切片提供統(tǒng)一數(shù)據(jù)的視圖。
>>> print A[:]; print A[:].shape [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] (3, 4) >>> print M[:]; print M[:].shape [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] (3, 4)
現(xiàn)在有些和Python索引不同的了:你可以同時(shí)使用逗號(hào)分割索引來沿著多個(gè)軸索引。
>>> print A[:,1]; print A[:,1].shape [1 5 9] (3,) >>> print M[:,1]; print M[:,1].shape [[1] [5] [9]] (3, 1)
注意最后兩個(gè)結(jié)果的不同。對(duì)二維數(shù)組使用一個(gè)冒號(hào)產(chǎn)生一個(gè)一維數(shù)組,然而矩陣產(chǎn)生了一個(gè)二維矩陣。[10](type(M[:,1])和type(A[:,1])你可以看到是這樣。)例如,一個(gè)M[2,:]切片產(chǎn)生了一個(gè)形狀為(1,4)的矩陣,相比之下,一個(gè)數(shù)組的切片總是產(chǎn)生一個(gè)最低可能維度[11](什么叫盡可能低的維度?不懂。)的數(shù)組。例如,如果C是一個(gè)三維數(shù)組,C[...,1]產(chǎn)生一個(gè)二維的數(shù)組而C[1,:,1]產(chǎn)生一個(gè)一維數(shù)組。從這時(shí)開始,如果相應(yīng)的矩陣切片結(jié)果是相同的話,我們將只展示數(shù)組切片的結(jié)果。
假如我們想要一個(gè)數(shù)組的第一列和第三列,一種方法是使用列表切片:
>>> A[:,[1,3]] array([[ 1, 3], [ 5, 7], [ 9, 11]])
稍微復(fù)雜點(diǎn)的方法是使用take()方法(method):
>>> A[:,].take([1,3],axis=1) array([[ 1, 3], [ 5, 7], [ 9, 11]])
如果我們想跳過第一行,我們可以這樣:
>>> A[1:,].take([1,3],axis=1) array([[ 5, 7], [ 9, 11]])
或者我們僅僅使用A[1:,[1,3]]。還有一種方法是通過矩陣向量積(叉積)。
>>> A[ix_((1,2),(1,3))] array([[ 5, 7], [ 9, 11]])
為了讀者的方便,再次寫下之前的矩陣:
>>> print A [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
現(xiàn)在讓我們做些更復(fù)雜的。比如說我們想要保留第一行大于1的列。一種方法是創(chuàng)建布爾索引:
>>> A[0,:]>1 array([False, False, True, True], dtype=bool) >>> A[:,A[0,:]>1] array([[ 2, 3], [ 6, 7], [10, 11]])
就是我們想要的!但是索引矩陣沒這么方便。
>>> M[0,:]>1 matrix([[False, False, True, True]], dtype=bool) >>> M[:,M[0,:]>1] matrix([[2, 3]])
這個(gè)過程的問題是用“矩陣切片”來切片產(chǎn)生一個(gè)矩陣[12](用矩陣切片),但是矩陣有個(gè)方便的A屬性,它的值是數(shù)組呈現(xiàn)的。所以我們僅僅做以下替代:
>>> M[:,M.A[0,:]>1] matrix([[ 2, 3], [ 6, 7], [10, 11]])
如果我們想要在矩陣兩個(gè)方向有條件地切片,我們必須稍微調(diào)整策略,代之以:
>>> A[A[:,0]>2,A[0,:]>1] array([ 6, 11]) >>> M[M.A[:,0]>2,M.A[0,:]>1] matrix([[ 6, 11]])
我們需要使用向量積ix_:
>>> A[ix_(A[:,0]>2,A[0,:]>1)] array([[ 6, 7], [10, 11]]) >>> M[ix_(M.A[:,0]>2,M.A[0,:]>1)] matrix([[ 6, 7], [10, 11]])2.8 技巧和提示
下面我們給出簡短和有用的提示。
“自動(dòng)”改變形狀更改數(shù)組的維度,你可以省略一個(gè)尺寸,它將被自動(dòng)推導(dǎo)出來。
>>> a = arange(30) >>> a.shape = 2,-1,3 # -1 means "whatever is needed" >>> a.shape (2, 5, 3) >>> a 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]]])向量組合(stacking)
我們?nèi)绾斡脙蓚€(gè)相同尺寸的行向量列表構(gòu)建一個(gè)二維數(shù)組?在MATLAB中這非常簡單:如果x和y是兩個(gè)相同長度的向量,你僅僅需要做m=[x;y]。在NumPy中這個(gè)過程通過函數(shù)column_stack、dstack、hstack和vstack來完成,取決于你想要在那個(gè)維度上組合。例如:
x = arange(0,10,2) # x=([0,2,4,6,8]) y = arange(5) # y=([0,1,2,3,4]) m = vstack([x,y]) # m=([[0,2,4,6,8], # [0,1,2,3,4]]) xy = hstack([x,y]) # xy =([0,2,4,6,8,0,1,2,3,4])
二維以上這些函數(shù)背后的邏輯會(huì)很奇怪。
參考寫個(gè)Matlab用戶的NumPy指南并且在這里添加你的新發(fā)現(xiàn): )
直方圖(histogram)NumPy中histogram函數(shù)應(yīng)用到一個(gè)數(shù)組返回一對(duì)變量:直方圖數(shù)組和箱式向量。注意:matplotlib也有一個(gè)用來建立直方圖的函數(shù)(叫作hist,正如matlab中一樣)與NumPy中的不同。主要的差別是pylab.hist自動(dòng)繪制直方圖,而numpy.histogram僅僅產(chǎn)生數(shù)據(jù)。
import numpy import pylab # Build a vector of 10000 normal deviates with variance 0.5^2 and mean 2 mu, sigma = 2, 0.5 v = numpy.random.normal(mu,sigma,10000) # Plot a normalized histogram with 50 bins pylab.hist(v, bins=50, normed=1) # matplotlib version (plot) pylab.show()
# Compute the histogram with numpy and then plot it (n, bins) = numpy.histogram(v, bins=50, normed=True) # NumPy version (no plot) pylab.plot(.5*(bins[1:]+bins[:-1]), n) pylab.show()2.9 擴(kuò)展閱讀
The Python tutorial
The NumPy Reference
The SciPy Tutorial
SciPy Lecture Notes
A matlab, R, IDL, NumPy/SciPy dictionary
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37844.html
摘要:包的核心是對(duì)象。但有個(gè)例外,包括對(duì)象數(shù)組的元素大小是不同的。序列大小和速度在科學(xué)計(jì)算中尤為重要。例如考慮兩個(gè)長度相同的列表中每個(gè)元素相乘的情況。此外,編碼所需的工作量隨數(shù)據(jù)維數(shù)的增加而增加。這些信息主要用于高級(jí)用戶。 譯者:飛龍 1.1 NumPy 是什么? 原文:What is NumPy? NumPy是Python中用于科學(xué)計(jì)算的基礎(chǔ)包。它是一個(gè)Python庫,提供多維數(shù)組對(duì)象,各...
摘要:將以指定數(shù)量的元素創(chuàng)建數(shù)組,并平分開始值和結(jié)束值。將創(chuàng)建數(shù)組的集合用一維數(shù)組來模擬高維數(shù)組,每一維都有表示它的變量。一個(gè)例子說明比口頭描述好得多計(jì)算規(guī)則網(wǎng)格上的高維函數(shù)時(shí),這會(huì)非常有用。 原文:Array creation 譯者:飛龍 ? 另見 數(shù)組創(chuàng)建例程 導(dǎo)言 數(shù)組創(chuàng)建的一般機(jī)制有五種: 從其它Python的結(jié)構(gòu)轉(zhuǎn)換(如列表和元組) 內(nèi)置的NumPy數(shù)組創(chuàng)建對(duì)象(如 ar...
摘要:其他數(shù)據(jù)類型在中沒有對(duì)應(yīng)。因此,使用數(shù)組標(biāo)量確保了數(shù)組和標(biāo)量之間具有相同的行為,無論值在不在數(shù)組中。不提供比的精度更高的特別是位四精度數(shù)據(jù)類型的是不能用的。 原文:Data types 譯者:飛龍 ? 另見 數(shù)據(jù)類型對(duì)象 數(shù)組類型和類型之間的轉(zhuǎn)換 NumPy支持的數(shù)值類型比Python更多。這一節(jié)會(huì)講述所有可用的類型,以及如何改變數(shù)組的數(shù)據(jù)類型。 數(shù)據(jù)類型 描述 bo...
摘要:主頁暫時(shí)下線社區(qū)暫時(shí)下線知識(shí)庫自媒體平臺(tái)微博知乎簡書博客園合作侵權(quán),請聯(lián)系請抄送一份到特色項(xiàng)目中文文檔和教程與機(jī)器學(xué)習(xí)實(shí)用指南人工智能機(jī)器學(xué)習(xí)數(shù)據(jù)科學(xué)比賽系列項(xiàng)目實(shí)戰(zhàn)教程文檔代碼視頻數(shù)據(jù)科學(xué)比賽收集平臺(tái),,劍指,經(jīng)典算法實(shí)現(xiàn)系列課本課本描述 【主頁】 apachecn.org 【Github】@ApacheCN 暫時(shí)下線: 社區(qū) 暫時(shí)下線: cwiki 知識(shí)庫 自媒體平臺(tái) ...
摘要:主頁暫時(shí)下線社區(qū)暫時(shí)下線知識(shí)庫自媒體平臺(tái)微博知乎簡書博客園合作侵權(quán),請聯(lián)系請抄送一份到特色項(xiàng)目中文文檔和教程與機(jī)器學(xué)習(xí)實(shí)用指南人工智能機(jī)器學(xué)習(xí)數(shù)據(jù)科學(xué)比賽系列項(xiàng)目實(shí)戰(zhàn)教程文檔代碼視頻數(shù)據(jù)科學(xué)比賽收集平臺(tái),,劍指,經(jīng)典算法實(shí)現(xiàn)系列課本課本描述 【主頁】 apachecn.org 【Github】@ApacheCN 暫時(shí)下線: 社區(qū) 暫時(shí)下線: cwiki 知識(shí)庫 自媒體平臺(tái) ...
閱讀 1471·2021-09-30 09:57
閱讀 1480·2021-09-09 09:33
閱讀 2246·2021-09-04 16:40
閱讀 1811·2021-09-01 10:50
閱讀 3257·2021-09-01 10:31
閱讀 2549·2019-08-30 15:56
閱讀 2980·2019-08-30 15:44
閱讀 3484·2019-08-29 17:29