Python 科學(xué)計(jì)算庫 NumPy 學(xué)習(xí)筆記 - 3 - 通用函數(shù)與聚合函數(shù)

電梯直達(dá):
Python 科學(xué)計(jì)算庫 NumPy 學(xué)習(xí)筆記 - 1
Python 科學(xué)計(jì)算庫 NumPy 學(xué)習(xí)筆記 - 2
Python 科學(xué)計(jì)算庫 NumPy 學(xué)習(xí)筆記 - 3
Python 科學(xué)計(jì)算庫 NumPy 學(xué)習(xí)筆記 - 4
Python 科學(xué)計(jì)算庫 NumPy 學(xué)習(xí)筆記 - 5
Python 科學(xué)計(jì)算庫 NumPy 學(xué)習(xí)筆記 - 6
Python 科學(xué)計(jì)算庫 NumPy 學(xué)習(xí)筆記 - 7
Python 科學(xué)計(jì)算庫 NumPy 學(xué)習(xí)筆記 - 8

11. NumPy 的通用函數(shù) ufunc

NumPy 中的向量化操作可以使數(shù)組元素的重復(fù)計(jì)算更加高效郁竟。而向量化操作可以通過通用函數(shù) ufuncs 來實(shí)現(xiàn)懊烤。

11.1 算術(shù)運(yùn)算

NumPyufunc 使用起來非常自然,因?yàn)樗鼈兛梢院唽憺?Python 的原生算術(shù)運(yùn)算符攒至。

ufunc 函數(shù) 對(duì)應(yīng)的運(yùn)算符 含義
np.add + 加法
np.subtract - 減法
np.negative - 一元取負(fù)
np.multiply * 乘法
np.divide / 除法
np.floor_divide // 整除
np.power ** 求冪
np.mod % 取模
import numpy as np

x = np.arange(5)
print("x      =", x)
print("x + 5  =", x + 5)
print("x - 5  =", x - 5)
print("x * 2  =", x * 2)
print("x / 2  =", x / 2)
print("x // 2 =", x // 2)
print("-x     = ", -x)
print("x ** 2 = ", x ** 2)
print("x % 2  = ", x % 2)
x      = [0 1 2 3 4]
x + 5  = [5 6 7 8 9]
x - 5  = [-5 -4 -3 -2 -1]
x * 2  = [0 2 4 6 8]
x / 2  = [0.  0.5 1.  1.5 2. ]
x // 2 = [0 0 1 1 2]
-x     =  [ 0 -1 -2 -3 -4]
x ** 2 =  [ 0  1  4  9 16]
x % 2  =  [0 1 0 1 0]

這些運(yùn)算符也可以組合使用:

print(-(0.5*x + 1) ** 2)
[-1.   -2.25 -4.   -6.25 -9.  ]

11.2 絕對(duì)值

ufunc 中取絕對(duì)值的函數(shù)是 np.absolute, 也可以使用它的別名 np.abs

x = np.array([-1, 0, 1, -2, 2])
np.abs(x)
array([1, 0, 1, 2, 2])

11.3 三角函數(shù)

  • np.sin
  • np.cos
  • np.tan
  • np.arcsin
  • np.arccos
  • np.arctan
x = np.array([-1, 0, 1])
np.arccos(x)
array([3.14159265, 1.57079633, 0.        ])

11.4 指數(shù)和對(duì)數(shù)

x = np.array([1, 3, 5])
print("x     =", x)
print("e^x   =", np.exp(x))
print("2^x   =", np.exp2(x))
print("3^x   =", np.power(3, x))
x     = [1 3 5]
e^x   = [  2.71828183  20.08553692 148.4131591 ]
2^x   = [ 2.  8. 32.]
3^x   = [  3  27 243]
y = [1, 3, 5]
print("y        =", x)
print("ln(y)    =", np.log(y))
print("log2(y)  =", np.log2(y))
print("log10(y) =", np.log10(y))
y        = [1 3 5]
ln(y)    = [0.         1.09861229 1.60943791]
log2(y)  = [0.         1.5849625  2.32192809]
log10(y) = [0.         0.47712125 0.69897   ]   

11.5 通用函數(shù) ufunc 的高級(jí)特性

11.5.1 指定輸出位置

所有的通用函數(shù)都可以通過 out 參數(shù)來指定計(jì)算結(jié)果的存放位置常侣。

x = np.arange(3)
y = np.empty(3)
np.multiply(x, 3, out=y)
print(y)
[0. 3. 6.]

11.5.2 聚合

所有的通用函數(shù)都可以通過 reduce 方法來聚合一個(gè)數(shù)組,即反復(fù)對(duì)數(shù)組的元素應(yīng)用給定的操作,直到只剩下一個(gè)結(jié)果但两。

比如在通用函數(shù) add 上調(diào)用 reduce 方法將返回?cái)?shù)組中所有元素的總和:

x = np.arange(101)
np.add.reduce(x)
5050

如果要存儲(chǔ)計(jì)算的所有中間結(jié)果,可以使用 accumulate 方法:

np.add.accumulate(x)
array([   0,    1,    3,    6,   10,   15,   21,   28,   36,   45,   55,
         66,   78,   91,  105,  120,  136,  153,  171,  190,  210,  231,
        253,  276,  300,  325,  351,  378,  406,  435,  465,  496,  528,
        561,  595,  630,  666,  703,  741,  780,  820,  861,  903,  946,
        990, 1035, 1081, 1128, 1176, 1225, 1275, 1326, 1378, 1431, 1485,
       1540, 1596, 1653, 1711, 1770, 1830, 1891, 1953, 2016, 2080, 2145,
       2211, 2278, 2346, 2415, 2485, 2556, 2628, 2701, 2775, 2850, 2926,
       3003, 3081, 3160, 3240, 3321, 3403, 3486, 3570, 3655, 3741, 3828,
       3916, 4005, 4095, 4186, 4278, 4371, 4465, 4560, 4656, 4753, 4851,
       4950, 5050], dtype=int32)

12. 聚合函數(shù):最小值供置、最大值及其他

通常在面對(duì)大量數(shù)據(jù)時(shí)谨湘,第一步就是計(jì)算數(shù)據(jù)集的匯總統(tǒng)計(jì)數(shù)據(jù)。如平均值、標(biāo)準(zhǔn)差以及總和紧阔、乘積坊罢、中位數(shù)、最小值和最大值擅耽、分位數(shù)等活孩。

NumPy 內(nèi)置了一系列可以用于快速獲取這些值的聚合函數(shù)。

12.1 數(shù)組求和

x = np.arange(101)
print(sum(x))
print(np.sum(x))
5050
5050

雖然 NumPysum 函數(shù)和 Python 的內(nèi)建函數(shù) sum 看以來差不多乖仇,但它的性能卻遠(yuǎn)超 Python 的內(nèi)建函數(shù)憾儒。

bigArray = np.random.rand(1000000)
%timeit sum(bigArray)
%timeit np.sum(bigArray)
248 ms ± 43.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1.23 ms ± 8.44 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

12.2 最小值和最大值

np.min(bigArray), np.max(bigArray)
(7.071203171893359e-07, 0.9999997207656334)

同樣,NumPy 的這兩個(gè)函數(shù)性能也遠(yuǎn)超 Python 的內(nèi)建函數(shù)乃沙。

%timeit min(bigArray)
%timeit np.min(bigArray)
123 ms ± 15.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
921 μs ± 172 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

12.3 其他聚合函數(shù)

函數(shù) NaN 安全版本 作用
np.sum np.nansum 計(jì)算總和
np.prod np.nanprod 計(jì)算乘積
np.mean np.nanmean 計(jì)算平均值
np.std np.nanstd 計(jì)算標(biāo)準(zhǔn)差
np.var np.nanvar 計(jì)算方差
np.min np.nanmin 計(jì)算最小值
np.max np.nanmax 計(jì)算最大值
np.argmin np.nanargmin 獲取最小值的序號(hào)
np.argmax np.nanargmax 獲取最大值的序號(hào)
np.median np.nanmedian 計(jì)算中位數(shù)
np.percentile np.nanpercentile Compute rank-based statistics of elements
np.any N/A 判斷是否含有為 True 的元素
np.all N/A 判斷是否所有元素都為 True

12.4 使用聚合函數(shù)的實(shí)例

使用 Pandas 讀取文件并提取數(shù)據(jù):

import pandas as pd
data = pd.read_csv('data/heights.csv')
heights = np.array(data['height(cm)'])
print(heights)
[189 170 189 163 183 171 185 168 173 183 173 173 175 178 183 193 178 173
 174 183 183 168 170 178 182 180 183 178 182 188 175 179 183 193 182 183
 177 185 188 188 182 185 190]
print('平均身高:', heights.mean())
print('標(biāo)準(zhǔn)差:', heights.std())
print('最大身高:', heights.max())
print('最小身高:', heights.min())
print('中位數(shù):',np.median(heights))
平均身高: 179.97674418604652
標(biāo)準(zhǔn)差: 7.023178807524852
最大身高: 193
最小身高: 163
中位數(shù): 182.0 
%matplotlib inline
import matplotlib.pyplot as plt

plt.hist(heights)
plt.title('Height Distribution')
plt.xlabel('height (cm)')
plt.ylabel('number');
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載起趾,如需轉(zhuǎn)載請(qǐng)通過簡信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末警儒,一起剝皮案震驚了整個(gè)濱河市训裆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜀铲,老刑警劉巖缭保,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝙茶,居然都是意外死亡艺骂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門隆夯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钳恕,“玉大人,你說我怎么就攤上這事蹄衷∮嵌睿” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵愧口,是天一觀的道長睦番。 經(jīng)常有香客問我,道長耍属,這世上最難降的妖魔是什么托嚣? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮厚骗,結(jié)果婚禮上示启,老公的妹妹穿的比我還像新娘。我一直安慰自己领舰,他們只是感情好夫嗓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布迟螺。 她就那樣靜靜地躺著,像睡著了一般舍咖。 火紅的嫁衣襯著肌膚如雪矩父。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天排霉,我揣著相機(jī)與錄音浙垫,去河邊找鬼。 笑死郑诺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杉武。 我是一名探鬼主播辙诞,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轻抱!你這毒婦竟也來了飞涂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤祈搜,失蹤者是張志新(化名)和其女友劉穎较店,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體容燕,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梁呈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蘸秘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官卡。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖醋虏,靈堂內(nèi)的尸體忽然破棺而出寻咒,到底是詐尸還是另有隱情,我是刑警寧澤颈嚼,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布毛秘,位于F島的核電站,受9級(jí)特大地震影響阻课,放射性物質(zhì)發(fā)生泄漏叫挟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一限煞、第九天 我趴在偏房一處隱蔽的房頂上張望霞揉。 院中可真熱鬧,春花似錦晰骑、人聲如沸适秩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骤公。三九已至,卻和暖如春扬跋,著一層夾襖步出監(jiān)牢的瞬間阶捆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工钦听, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洒试,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓朴上,卻偏偏與公主長得像垒棋,于是被迫代替她去往敵國和親酗失。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛛淋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353