tags:
- 第四章 NumPy基礎:數(shù)組和矢量計算
- NumPy的ndarray:一種多維數(shù)組對象
NumPy的ndarray:一種多維數(shù)組對象
創(chuàng)建ndarray
1.使用array函數(shù)。它接受一切序列型的對象(包括其他數(shù)組)锉屈,然后產(chǎn)生一個新的含有摻入數(shù)據(jù)的NumPy數(shù)組。以一個列表的轉換為例:
2.嵌套序列斑匪,比如一組等長列表組成的列表,將會被轉換成為一個多維數(shù)組:
ndarray.ndim?
數(shù)組維數(shù)奥吩。
ndarray.shape?
Tuple of array dimensions.
3.除了顯示說明掂之,np.arry會嘗試為新建的這個數(shù)組推斷出一個較為合適的數(shù)據(jù)類型店诗。數(shù)據(jù)類型保存在dtype對象中。
4.除np.array外盏混,可以新建數(shù)組的函數(shù):
*zeros:創(chuàng)建指定長度或形狀(shape)的全0數(shù)組
*ones:創(chuàng)建指定長度或形狀的全1數(shù)組
*empty:創(chuàng)建一個沒有任何具體值得數(shù)組(應該除了隨機值需求不是很好用)
xxx((a,b,c,d,^,z))字母表示任意數(shù)字,最后一個值(z)是最內(nèi)層元素個數(shù)(長度)蔚鸥,倒數(shù)第n個值表示前一個子單位的個數(shù)
5.arrange是Python內(nèi)置函數(shù)range的數(shù)組版
函數(shù) | 說明 |
---|---|
array | 1.將輸入數(shù)據(jù)轉換為ndarray;2.指定dtype或默認推斷出一個合適的dtype;3.默認直接復制輸入數(shù)據(jù) |
asarray | 1.將輸入數(shù)據(jù)轉換為ndarray许赃;2.如果輸入本身就是ndarray不進行復制 |
arange | 類似于內(nèi)置的range止喷,但返回的是一個ndarray對象而不是列表 |
ones_like/zeros_like/empty_like | 以另一個數(shù)組為參數(shù),并根據(jù)其形狀和dtype創(chuàng)建一個全1/全0/全隨機的數(shù)組 |
eye/identity | 創(chuàng)建正方形對角線為1混聊,其他全0的矩陣弹谁,eye一些屬性可以改變這條對角線 |
ndarray的數(shù)據(jù)類型
1.通過'ndarray.astype'的方法顯示轉換數(shù)據(jù)類型(detype);
注意*浮點數(shù)轉整數(shù)會失效
從NumPy 1.9開始,astype方法現(xiàn)在返回一個錯誤句喜,如果要轉換為的字符串dtype在“安全”轉換模式下不夠長预愤,以保持正在轉換的整數(shù)/浮點數(shù)組的最大值。以前咳胃,即使結果被截斷植康,也允許進行轉換。
*可以轉換成其他變量的dtype
調(diào)用astype無論如何都會創(chuàng)建出一個新數(shù)組展懈,即使dtype和老數(shù)據(jù)相同也是销睁。
數(shù)組和標量之間的運算
NumPy中的數(shù)組可以不用編寫循環(huán)即可以對數(shù)據(jù)執(zhí)行執(zhí)行批量運算。這通常就叫做矢量化存崖。
基本的索引和切片
*一維數(shù)組和Python列表功能類似冻记。但是。
不同1:當你給一個標量賦值給一個切片是(arr[5:8]=12),該值會自動傳播(廣播)到整個選區(qū)
python中不允許這樣賦值
不同2:跟列表最重要的區(qū)別在于来惧,數(shù)組切片是原始數(shù)組的視圖冗栗。這意味著數(shù)據(jù)不會被賦值,視圖上的任何修改都會直接反映到源數(shù)組上:
!U曷鳌偶房!完全是不一樣的邏輯趁曼,有一種嫁雞隨雞嫁狗隨狗一輩子相依為命的感覺军浆。
雖然驚訝,但是這是由于NumPyde 的設計目的是處理大數(shù)據(jù)挡闰,如果NumPy堅持要將數(shù)據(jù)復制來復制去會產(chǎn)生很大的性能和內(nèi)存問題乒融。(arr[5:8].copy可以解決如果不想要這種隨之改變的效果,這里即arr_slice=arr[5:8].copy())
*之后感受一下二維數(shù)組的操作:
arr2d[0,2] 用法等價于 arr2d[0][2],但是前者更簡單
*多維數(shù)組摄悯,如果省略了后面的索引赞季,則返回對象會是一個維度第一點(低一個維度)的ndarray。返回的低維數(shù)組含有原始高維數(shù)組某條軸上的所有數(shù)據(jù)奢驯。(括號外面的“維度”是一維申钩、二維、三維瘪阁、四維之類的意思撒遣,二括號面的應該理解為“軸”)
切片索引
ndarray的切片語法和Python列表這樣的以為對象差不多。
高緯度更多花樣管跺,可以在一個或多個軸上進行切片义黎,也可以跟幀數(shù)索引混合使用。
** 布爾型索引**
這里可以看出目前版本負號的用法已經(jīng)不可以了豁跑,另外這里&廉涕、|之類的布爾運算都有效,但是Python關鍵字and和or是在布爾類型數(shù)組中是無效的艇拍。
花式索引
花式索引是一個NumPy術語狐蜕,它指的是利用整數(shù)數(shù)組進行索引。
numpy.reshape(a, newshape, order='C')[source]?
Gives a new shape to an array without changing its data.
arr=np.arange(32).reshape((8,4))
arr
Out[2]:
array([[ 0, 1, 2, 3],#0
[ 4, 5, 6, 7],#1
[ 8, 9, 10, 11],#2
[12, 13, 14, 15],#3
[16, 17, 18, 19],#4
[20, 21, 22, 23],#5
[24, 25, 26, 27],#6
[28, 29, 30, 31]])#7
arr[[1,5,7,2],[0,3,1,2]]
Out[6]: array([ 4, 23, 29, 10])#即最終選出了(1,0)卸夕、(5,3)馏鹤、(7,1)、(2,2)
想要得到矩陣的子集也是一個矩形區(qū)域娇哆,可以:
**花式索引和切片不同湃累,它總是將數(shù)據(jù)復制到新數(shù)組中
數(shù)組專職和軸對換
array.T:轉置(軸對換)
np.dot(a,b):array 'a'、'b'的矩陣內(nèi)積
ndarray.transpose(*軸)?
返回軸轉置的數(shù)組視圖碍讨。
對于1-D陣列治力,這沒有任何影響。(要在列向量和行向量之間切換勃黍,首先將1-D數(shù)組轉換為矩陣對象宵统。)對于2-D數(shù)組,這是通常的矩陣轉置。對于nD陣列马澈,如果給出軸瓢省,則它們的順序表示軸的置換方式(參見示例)。如果沒有提供軸 痊班,那么勤婚。
a.shape = (i[0], i[1], ... i[n-2], i[n-1]) a.transpose().shape = (i[n-1], i[n-2], ... i[1], i[0])
| 參數(shù): |
axis:無,int的元組或n int
- 無參數(shù)或無參數(shù):反轉軸的順序涤伐。
- 整數(shù)的元組:我在?在元組第地方意味著一個的 我個軸變?yōu)?em>a.transpose()的?個軸馒胆。
-
n int:與相同整數(shù)的n元組相同(此形式僅作為元組形式的“便利”替代)
所以arr.transpose((1,0,2))等于只是0,1軸置換
In [59]: arr1 = np.arange(12).reshape(2,2,3)
In [60]: arr1
Out[60]:
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
In [61]: arr1.shape #看形狀
Out[61]: (2, 2, 3) #說明這是一個2*2*3的數(shù)組(矩陣),返回的是一個元組凝果,可以對元組進行索引祝迂,也就是0,1,2
In [62]: arr1.transpose((1,0,2))
Out[62]:
array([[[ 0, 1, 2],
[ 6, 7, 8]],
[[ 3, 4, 5],
[ 9, 10, 11]]])
ndarray.swapaxes(axis1, axis2)?
Return a view of the array with axis1 and axis2 interchanged.