小蛇學(xué)python(16)numpy高階用法

如果只是從事簡單的數(shù)據(jù)分析困后,其實(shí)numpy的用處并不是很大澈灼。簡單了解一下numpy絮缅,學(xué)好pandas已經(jīng)夠用怎燥,尤其是對于結(jié)構(gòu)化或表格化數(shù)據(jù)负饲。但是精通面向數(shù)組的編程和思維方式是成為python科學(xué)計(jì)算牛人的關(guān)鍵一步堤魁。

而且使用numpy的代碼往往比普通數(shù)組要快,因?yàn)閿?shù)組運(yùn)算一般都比純python循環(huán)要快得多返十。大量使用列表妥泉,將無可避免的使用循環(huán)。

當(dāng)大家對numpy足夠熟悉的時候洞坑,我建議大家這樣做:

  1. 將python循環(huán)和條件邏輯轉(zhuǎn)換為數(shù)組運(yùn)算和布爾數(shù)組運(yùn)算盲链。
  2. 盡量使用廣播。
  3. 避免復(fù)制數(shù)據(jù)迟杂,盡量使用數(shù)組視圖刽沾,即切片。
  4. 利用ufunc及其它各種方法排拷。

線性代數(shù)

import numpy as np

x = np.array([[1, 2, 3], [4, 5, 6]])

y = np.array([[6, 23], [-1, 7], [8, 9]])
print(x)
print(y)

print(x.dot(y))

image.png

這是最基礎(chǔ)的矩陣計(jì)算侧漓。比較常用的矩陣計(jì)算函數(shù)如下。

函數(shù) 說明
diag 以一位數(shù)組形式返回對角線元素
dot 矩陣乘法
trace 矩陣跡
det 行列式值
eig 本征值與本征向量
inv 求逆
pinv Moore-Penrose偽逆
qr QR分解
svd 奇異值分解
solve 解線性方程組Ax=b
lstsq 計(jì)算Ax=b的最小二乘解

高級數(shù)據(jù)操作

ndarray數(shù)組視圖不復(fù)制任何數(shù)據(jù)的原因是因?yàn)楣テ茫琻darray不只是一塊內(nèi)存和一個dtype火架,更準(zhǔn)確的說它還有跨度信息,這使得數(shù)組能以各種步幅在內(nèi)存中移動忙菠。(其實(shí)移動的是指針)也因此何鸡,ndarray數(shù)組有很多我們意想不到的功能。

import numpy as np

arr = np.arange(8)
print(arr)
new_arr = arr.reshape((4, 2))
print(arr)
print(new_arr)
image.png

同樣牛欢,既然可以重塑骡男,那也可以扁平化,即展開傍睹。

import numpy as np

arr = np.arange(8)
new_arr = arr.reshape((4, 2))
print(new_arr)
new_new_arr = new_arr.ravel()
print(new_new_arr)

image.png

在這里要提及一點(diǎn)隔盛。與其他科學(xué)計(jì)算環(huán)境相反(R或matlab),numpy允許更為靈活地控制數(shù)據(jù)在內(nèi)存中的布局犹菱。具體來說,比如展開數(shù)組時是按列優(yōu)先還是按行優(yōu)先吮炕。

pandas的操作對象主要是結(jié)構(gòu)化數(shù)據(jù)腊脱,numpy的操作對象主要是ndarray數(shù)組。這兩者之間有很多功能函數(shù)是一一對應(yīng)的龙亲,比如陕凹,pandas有對表格的拼接,ndarray也有對數(shù)組的拼接鳄炉。

import numpy as np

arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10 ,11, 12]])
print(np.concatenate([arr1, arr2], axis=0))
print(np.concatenate([arr1, arr2], axis=1))
image.png

有拼接就有拆分杜耙,split函數(shù)用于將一個數(shù)組沿指定軸拆分為多個數(shù)組。

import numpy as np
from numpy.random import  randn

arr = randn(8, 2)
first, second, third = np.split(arr, [2, 3])
print(first)
print(second)
print(third)
image.png

還有很多功能不一一介紹拂盯,其實(shí)非常簡單佑女,在這里只是引起大家注意,知道numpy功能的強(qiáng)大谈竿。

還需要注意一點(diǎn)的是团驱,這些函數(shù)都是建立在ndarray數(shù)組之上的,列表榕订,元組等并無此功能店茶。

廣播機(jī)制

所謂廣播是說不同形狀的數(shù)組之間的算術(shù)運(yùn)算的執(zhí)行方式蜕便。

將標(biāo)量值和數(shù)組進(jìn)行組合時就會發(fā)生最簡單的廣播劫恒。

import numpy as np


arr = np.arange(5)
print(arr)
print(arr-1)
image.png

如圖所示,當(dāng)數(shù)組和數(shù)字之間運(yùn)算時轿腺,并沒有報錯两嘴,而是每個數(shù)組元素和該數(shù)字做了運(yùn)算。這在很多科研數(shù)據(jù)處理的時候族壳,會方便很多憔辫。

ufunc高級應(yīng)用

ufunc除了一些通用的施行特定矢量化運(yùn)算的特殊方法外,還可以自定義函數(shù)對數(shù)組進(jìn)行運(yùn)算仿荆。

import numpy as np

def add_elements(x, y):
    return x + y

add_them = np.frompyfunc(add_elements, 2, 1)
print(add_them(np.arange(8), np.arange(8)))
image.png

當(dāng)然贰您,不幸的是,這種創(chuàng)造ufunc的手段雖然很靈活拢操,卻非常慢锦亦。因?yàn)樗鼈冊谟?jì)算的時候都要執(zhí)行一次python函數(shù)調(diào)用,這自然會比numpy自帶的基于C編寫的ufunc慢很多令境。

為此杠园,python科學(xué)計(jì)算社區(qū)正在開發(fā)一些項(xiàng)目,力求使自定義ufunc的性能接近內(nèi)置的那些舔庶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抛蚁,一起剝皮案震驚了整個濱河市陈醒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞧甩,老刑警劉巖钉跷,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肚逸,居然都是意外死亡尘应,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門吼虎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犬钢,“玉大人,你說我怎么就攤上這事思灰$栌蹋” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵洒疚,是天一觀的道長歹颓。 經(jīng)常有香客問我,道長油湖,這世上最難降的妖魔是什么巍扛? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮乏德,結(jié)果婚禮上撤奸,老公的妹妹穿的比我還像新娘。我一直安慰自己喊括,他們只是感情好胧瓜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著郑什,像睡著了一般府喳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蘑拯,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天钝满,我揣著相機(jī)與錄音,去河邊找鬼申窘。 笑死弯蚜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的偶洋。 我是一名探鬼主播熟吏,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牵寺?” 一聲冷哼從身側(cè)響起悍引,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帽氓,沒想到半個月后趣斤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黎休,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年浓领,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片势腮。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡联贩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捎拯,到底是詐尸還是另有隱情泪幌,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布署照,位于F島的核電站祸泪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏建芙。R本人自食惡果不足惜没隘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望禁荸。 院中可真熱鬧右蒲,春花似錦、人聲如沸屡限。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钧大。三九已至,卻和暖如春罩旋,著一層夾襖步出監(jiān)牢的瞬間啊央,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工涨醋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓜饥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓浴骂,卻偏偏與公主長得像乓土,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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