[python][科學(xué)計算][numpy]使用指南6-重構(gòu)

最后一次更新日期: 2019/4/13

NumPy 是一個 Python 包馆揉。 它代表 “Numeric Python”机断。 它是一個由多維數(shù)組對象(ndarray)和用于處理數(shù)組的例程集合組成的庫缭受。
使用NumPy须眷,開發(fā)人員可以執(zhí)行以下操作:

  • 數(shù)組的算數(shù)和邏輯運算耸黑。
  • 傅立葉變換和用于圖形操作的例程梅桩。
  • 與線性代數(shù)有關(guān)的操作。 NumPy 擁有線性代數(shù)和隨機數(shù)生成的內(nèi)置函數(shù)伯铣。

使用前先導(dǎo)入模塊:
import numpy as np

1. 類型轉(zhuǎn)換

In [619]: a=np.array([[1,2],[3,4]])

In [620]: a.dtype
Out[620]: dtype('int32')

In [621]: a=a.astype('float64')

In [622]: a.dtype
Out[622]: dtype('float64')

In [623]: a=np.int32(a)

In [624]: a.dtype
Out[624]: dtype('int32')

使用ndarray.astype方法或是使用數(shù)據(jù)類型同名方法都可以轉(zhuǎn)換類型呻此,關(guān)于numpy支持的數(shù)據(jù)類型可以查看屬性章節(jié)。轉(zhuǎn)換類型后返回一個新數(shù)組腔寡。

2. 重塑

(1). 改變形狀
In [625]: a=np.array([[1,2],[3,4]])

In [626]: a.reshape((1,4))
Out[626]: array([[1, 2, 3, 4]])

In [627]: a.reshape((-1,4))
Out[627]: array([[1, 2, 3, 4]])

使用tuple類型的參數(shù)聲明新的形狀焚鲜。允許有一個新軸的大小為-1,表示自動計算放前。
改變前后元素數(shù)size需要保持一致忿磅。元素在軸上的排列是從最后一個軸開始往前面的軸方向上堆疊,見如下圖示凭语,可通過order參數(shù)指定其他排序方式葱她。軸的相對位置不會改變,所以一些復(fù)雜的變形可能需要結(jié)合transposeswapaxes此類軸交換方法使用似扔。

(2). 平鋪
In [640]: a.ravel()
Out[640]: array([1, 2, 3, 4])

In [641]: a.flatten()
Out[641]: array([1, 2, 3, 4])

將數(shù)組平鋪為向量吨些,等效于reshape((-1,)),可通過order參數(shù)指定其他排序方式炒辉。

(3). 轉(zhuǎn)置
In [643]: a.T
Out[643]: 
array([[1, 3],
       [2, 4]])

數(shù)組為一維時轉(zhuǎn)置無效豪墅,為二維時即矩陣的轉(zhuǎn)置,多于二維時交換第一個和最后一個軸黔寇。

(4). 軸交換
In [646]: a.swapaxes(0,1)
Out[646]: 
array([[1, 3],
       [2, 4]])

In [647]: a.transpose([1,0])
Out[647]: 
array([[1, 3],
       [2, 4]])

swapaxes一次只能指定兩個軸進行交換偶器,transpose可以重新為所有軸排序。

3. 排序

(1). 直接排序
In [734]: a=np.array([[2,3],[1,4]])

In [735]: np.sort(a,axis=None)
Out[735]: array([1, 2, 3, 4])

In [736]: a.sort(axis=0)

In [737]: a
Out[737]: 
array([[1, 3],
       [2, 4]])

ndarray.sort會直接在原數(shù)組上排序缝裤,可通過第一個參數(shù)axis指定排序的軸屏轰,會將沿著該軸方向的每個向量單獨排序,默認(rèn)-1憋飞,除沿最后一個軸外霎苗,指定其他軸都會在排序時生成數(shù)據(jù)的臨時副本,因此沿最后一個軸排序最快搀崭。
等效方法np.sort叨粘,返回的是排序后的副本猾编,還可指定axis=None瘤睹,會將數(shù)組展開再排序升敲。
當(dāng)數(shù)組的維度具備實際含義時,直接排序會打亂數(shù)據(jù)結(jié)構(gòu)轰传,得到不被期望的結(jié)果驴党,這種情況下需要使用間接排序。

(2). 間接排序
In [740]: a=np.array([[2,3,5],[1,1,4],[1,2,3]])

In [741]: a
Out[741]: 
array([[2, 3, 5],
       [1, 1, 4],
       [1, 2, 3]])

In [742]: idx1=np.argsort(a[:,0])

In [743]: a[idx1]
Out[743]: 
array([[1, 1, 4],
       [1, 2, 3],
       [2, 3, 5]])

In [744]: idx2=np.lexsort((a[:,0],a[:,2]))

In [745]: a[idx2]
Out[745]: 
array([[1, 2, 3],
       [1, 1, 4],
       [2, 3, 5]])

argsort可用于單鍵間接排序获茬,lexsort可用于多鍵間接排序港庄。

(3). 隨機排序
In [763]: a=np.arange(12).reshape((3,4))

In [764]: a
Out[764]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

In [765]: np.random.shuffle(a)

In [766]: a
Out[766]: 
array([[ 4,  5,  6,  7],
       [ 0,  1,  2,  3],
       [ 8,  9, 10, 11]])

In [768]: idx=np.random.permutation(a.shape[1])

In [769]: a[:,idx]
Out[769]: 
array([[ 4,  5,  7,  6],
       [ 0,  1,  3,  2],
       [ 8,  9, 11, 10]])

方法一np.random.shuffle只能沿第一個軸進行隨機排序,方法二是通過np.random.permutation恕曲,該方法也只能沿第一個軸隨機排序鹏氧,但在輸入?yún)?shù)xint類型時,會對np.arange(x)進行隨機排序佩谣,可以快速生成亂序索引把还,再通過索引查找得到亂序數(shù)組。

(4). 分區(qū)排序
In [799]: a=np.array([2,3,1,5,4,0,8])

In [800]: np.partition(a,1)
Out[800]: array([0, 1, 3, 5, 4, 2, 8])

In [801]: np.partition(a,4)
Out[801]: array([0, 1, 2, 3, 4, 5, 8])

分區(qū)排序是一種不完整的排序茸俭,用于不需要獲取完整排序序列的情況下吊履。該方法只保證kth指定位置的元素是正確排序的,其他小于該元素的元素前移调鬓,大于的后移艇炎。可用于快速找出第k大或第k小的元素腾窝。
也可通過ndarray.partition調(diào)用缀踪,axis參數(shù)指定軸方向,還有對應(yīng)的np.argpartition用于獲取分區(qū)后的索引虹脯。

4. 去重

In [775]: a=np.array([3,2,2,3,1,1,4])

In [776]: np.unique(a,return_index=True,return_inverse=True,return_counts=True,axis=None)
Out[776]: 
(array([1, 2, 3, 4]),
 array([4, 1, 0, 6], dtype=int64),
 array([2, 1, 1, 2, 0, 0, 3], dtype=int64),
 array([2, 2, 2, 1], dtype=int64))

In [777]: a=np.array([[1,3],[2,4],[1,3]])

In [778]: np.unique(a,axis=0)
Out[778]: 
array([[1, 3],
       [2, 4]])

axis指定去重的軸辜贵,默認(rèn)None會將數(shù)組展開后再去重。
返回值一為去重后的有序值列表归形;
返回值二為唯一值在原數(shù)組中的索引托慨,僅在return_index=True時提供;
返回值三為根據(jù)唯一值重建原數(shù)組的索引暇榴,僅在return_inverse=True時提供厚棵;
返回值四為唯一值的出現(xiàn)計數(shù),僅在return_counts=True時提供蔼紧。

5. 拆分

(1). 索引拆分

In [780]: a=np.arange(9).reshape((3,3))

In [781]: a[:2,:],a[2:,:]
Out[781]: 
(array([[0, 1, 2],
        [3, 4, 5]]), array([[6, 7, 8]]))

In [782]: a[a>2],a[~(a>2)]
Out[782]: (array([3, 4, 5, 6, 7, 8]), array([0, 1, 2]))

In [790]: idx=np.random.permutation(a.shape[0])

In [791]: sp_idx=int(a.shape[0]*0.8)

In [792]: a[idx[:sp_idx]],a[idx[sp_idx:]]
Out[792]: 
(array([[3, 4, 5],
        [6, 7, 8]]), array([[0, 1, 2]]))

最靈活的方式婆硬,復(fù)雜的拆分需要寫較多的代碼,可使用其他方法配合生成用于拆分的索引奸例,比如使用np.digitize進行分箱彬犯。

(2). 拆分方法

In [802]: a=np.arange(8)

In [803]: np.split(a,2)
Out[803]: [array([0, 1, 2, 3]), array([4, 5, 6, 7])]

In [805]: np.split(a,[2,5])
Out[805]: [array([0, 1]), array([2, 3, 4]), array([5, 6, 7])]

In [806]: a=a.reshape((2,4))

In [807]: a
Out[807]: 
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])

In [809]: np.split(a,[1,3],axis=1)
Out[809]: 
[array([[0],
        [4]]), array([[1, 2],
        [5, 6]]), array([[3],
        [7]])]

第二個參數(shù)indices_or_sections指定分割方式向楼,int類型表示等分?jǐn)?shù)量,一維數(shù)組類型表示用于分割的索引值谐区,例如[2,5]表示分割為a[:2],a[2:5],a[5:]湖蜕。
第三個參數(shù)axis可以指定軸方向。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宋列,一起剝皮案震驚了整個濱河市昭抒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炼杖,老刑警劉巖灭返,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坤邪,居然都是意外死亡熙含,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門艇纺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怎静,“玉大人,你說我怎么就攤上這事喂饥∠迹” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵员帮,是天一觀的道長或粮。 經(jīng)常有香客問我,道長捞高,這世上最難降的妖魔是什么氯材? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮硝岗,結(jié)果婚禮上氢哮,老公的妹妹穿的比我還像新娘。我一直安慰自己型檀,他們只是感情好冗尤,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胀溺,像睡著了一般裂七。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仓坞,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天背零,我揣著相機與錄音,去河邊找鬼无埃。 笑死徙瓶,一個胖子當(dāng)著我的面吹牛毛雇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侦镇,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼灵疮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虽缕?” 一聲冷哼從身側(cè)響起始藕,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒲稳,失蹤者是張志新(化名)和其女友劉穎氮趋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體江耀,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡剩胁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了祥国。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昵观。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舌稀,靈堂內(nèi)的尸體忽然破棺而出啊犬,到底是詐尸還是另有隱情,我是刑警寧澤壁查,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布觉至,位于F島的核電站,受9級特大地震影響睡腿,放射性物質(zhì)發(fā)生泄漏语御。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一席怪、第九天 我趴在偏房一處隱蔽的房頂上張望应闯。 院中可真熱鬧,春花似錦挂捻、人聲如沸碉纺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骨田。三九已至,卻和暖如春疫赎,著一層夾襖步出監(jiān)牢的瞬間盛撑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工捧搞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抵卫,地道東北人狮荔。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像介粘,于是被迫代替她去往敵國和親殖氏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

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