Python One-liners(2)

上回說到這本書的第二章 Python One-Liners(1)

這回來到第三章,是關(guān)于 Data Science 的一行代碼(這里寫其中一個)

有一個 (4, 6) 的二維數(shù)組 X,每行代表一個城市的空氣質(zhì)量指數(shù) ( AQI )

import numpy as np
## AQI data, row=city 行:城市
X = np.array([[42,40,41,43,44,43], # Hong Kong
              [30,31,29,29,29,30], # New york
              [8,13,31,11,11,9],  # Berlin
              [11,11,12,13,11,12]]) # Montreal

cities = np.array(['HongKong','Newyork','Berlin','Montreal'])

問題:找出這幾個城市中空氣質(zhì)量指數(shù)大于平均值的城市。

先給結(jié)果:

## One-Liner
polluted = set(cities[np.nonzero(X > np.average(X))[0]])

# 輸出結(jié)果:
print(polluted)
# {'Berlin', 'HongKong', 'Newyork'}

How It Works?

我們從里到外一步一步拆解

np.average() 用于求 X 的平均值

np.average(X) 
## 24.333333333333332

X > np.average(X) 會得到一個布爾值組成的二維數(shù)組遗锣,即橘忱,用X中的每一個元素和平均值比較大小,這里涉及到 Numpy 的廣播機(jī)制(Broadcast)拐邪,大則為True袖订, 小則為False

X > np.average(X) # 判斷 X 的元素哪些大于平均值
## 結(jié)果如下:
array([[ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [False, False,  True, False, False, False],
       [False, False, False, False, False, False]])

np.nonzero()的輸入?yún)?shù)為數(shù)組氮帐,返回值為相應(yīng)數(shù)組中非零元素的下標(biāo)數(shù)組,輸入的數(shù)組是幾維的洛姑,則輸出相應(yīng)個數(shù)的數(shù)組組成的tuple上沐,看下面的例子更加直觀:

# 一維數(shù)組
np.nonzero([1,0,2])
# 結(jié)果: 第0個和第2個下標(biāo)(索引)對應(yīng)的元素非0
(array([0, 2], dtype=int64),)

# 布爾值組成的一維數(shù)組
np.nonzero([True,True,False,True])
# 結(jié)果: 第0,1楞艾,3個元素為True参咙,則輸出相應(yīng)下標(biāo)組成的數(shù)組
 (array([0, 1, 3], dtype=int64),)
 
 # 二維數(shù)組  
np.nonzero([[1,2,0],
            [0,0,3]])
 # 結(jié)果 :分別是下標(biāo)為[0,0]的1,下標(biāo)為[0,1]的2,下標(biāo)為[1,2]的3非零
# 所以輸出了第一維的下標(biāo)[0,0,1]和第二維的下標(biāo)[0, 1, 2]組成的tuple
 (array([0, 0, 1], dtype=int64), 
  array([0, 1, 2], dtype=int64))
 
 # 三維數(shù)組依此類推
 np.nonzero([[[1,2,0],[0,0,3]],
            [[0,4,0],[0,5,0]]])
 # 結(jié)果:
 (array([0, 0, 0, 1, 1], dtype=int64),
 array([0, 0, 1, 0, 1], dtype=int64),
 array([0, 1, 2, 1, 1], dtype=int64))

那么,回到這個問題产徊,是對布爾值組成的二維數(shù)組進(jìn)行 nonzero() 計算

np.nonzero(X > np.average(X)) 
# 得到結(jié)果:
 (array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2], dtype=int64),
 array([0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 2], dtype=int64))

對于二維數(shù)組,可以這樣理解蜀细,nonzero() 返回的 tuple 中舟铜,第0個數(shù)組代表的是行索引(下標(biāo)),第1個數(shù)組代表的是列索引奠衔。

取得行索引:

np.nonzero(X > np.average(X))[0]
## 取得行索引結(jié)果
array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2], dtype=int64)

由于題目的數(shù)據(jù)中谆刨,每一行代表一個城市,可以通過行索引归斤,在 cities 中找到對應(yīng)的城市痊夭,也就是:

cities[np.nonzero(X > np.average(X))[0]]
## 結(jié)果:
## array(['HongKong', 'HongKong', 'HongKong', 
 'HongKong', 'HongKong', 'HongKong', 
 'Newyork', 'Newyork', 'Newyork', 
 'Newyork', 'Newyork','Newyork',
 'Berlin'], dtype='<U8')

再通過 set()對上面的結(jié)果集進(jìn)行去重處理,得到最終結(jié)果

set(cities[np.nonzero(X > np.average(X))[0]]) 
# 結(jié)果:
{'Berlin', 'HongKong', 'Newyork'}
五一勞動節(jié)快樂

知識點總結(jié)及參考鏈接:

numpy.average()

https://www.runoob.com/numpy/numpy-statistical-functions.html

https://numpy.org/devdocs/reference/generated/numpy.average.html#numpy.average

numpy.nonzero()

https://www.runoob.com/numpy/numpy-sort-search.html

numpy-Broadcasting

https://www.runoob.com/numpy/numpy-broadcast.html

https://www.numpy.org.cn/article/basics/python_numpy_tutorial.html#%E5%B9%BF%E6%92%AD-broadcasting

Python.set()

https://www.runoob.com/python/python-func-set.html

感謝你的閱讀脏里,希望有所收獲她我。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子番舆,更是在濱河造成了極大的恐慌酝碳,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恨狈,死亡現(xiàn)場離奇詭異疏哗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)禾怠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門返奉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吗氏,你說我怎么就攤上這事芽偏。” “怎么了牲证?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵哮针,是天一觀的道長。 經(jīng)常有香客問我坦袍,道長十厢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任捂齐,我火速辦了婚禮蛮放,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奠宜。我一直安慰自己包颁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布压真。 她就那樣靜靜地躺著娩嚼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滴肿。 梳的紋絲不亂的頭發(fā)上岳悟,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音泼差,去河邊找鬼贵少。 笑死,一個胖子當(dāng)著我的面吹牛堆缘,可吹牛的內(nèi)容都是我干的滔灶。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼吼肥,長吁一口氣:“原來是場噩夢啊……” “哼录平!你這毒婦竟也來了麻车?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤萄涯,失蹤者是張志新(化名)和其女友劉穎绪氛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涝影,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡枣察,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了燃逻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片序目。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖伯襟,靈堂內(nèi)的尸體忽然破棺而出猿涨,到底是詐尸還是另有隱情,我是刑警寧澤姆怪,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布叛赚,位于F島的核電站,受9級特大地震影響稽揭,放射性物質(zhì)發(fā)生泄漏俺附。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一溪掀、第九天 我趴在偏房一處隱蔽的房頂上張望事镣。 院中可真熱鬧,春花似錦揪胃、人聲如沸璃哟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽随闪。三九已至,卻和暖如春骚勘,著一層夾襖步出監(jiān)牢的瞬間铐伴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工调鲸, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留盛杰,地道東北人挽荡。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓藐石,卻偏偏與公主長得像,于是被迫代替她去往敵國和親定拟。 傳聞我的和親對象是個殘疾皇子于微,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350