30天拿下Python之numpy模塊

概述

在上一節(jié)误阻,我們介紹了Python的requests模塊债蜜,包括:發(fā)送POST請求、發(fā)送GET請求究反、設(shè)置請求頭寻定、會話管理等內(nèi)容。在這一節(jié)精耐,我們將介紹Python的numpy模塊狼速。numpy模塊是Python的一個非常重要的科學(xué)計算庫,它提供了多維數(shù)組對象卦停,以及一系列操作這些數(shù)組的函數(shù)向胡。numpy還是許多科學(xué)計算庫的基礎(chǔ),比如:SciPy惊完、Pandas僵芹、Matplotlib等。

多維數(shù)組

numpy的核心功能是多維數(shù)組對象ndarray小槐,它是一個快速拇派、靈活的大型數(shù)據(jù)容器,可以存儲單一數(shù)據(jù)類型的元素本股。ndarray是同質(zhì)的攀痊,即:所有元素都是相同的類型,并且可以通過索引訪問拄显。多維數(shù)組可以表示一維苟径、二維、三維甚至更高維的數(shù)據(jù)躬审,每個維度可以有不同的長度棘街。
可以使用numpy.array()函數(shù)從列表或元組創(chuàng)建多維數(shù)組,或使用numpy.zeros()承边、numpy.ones()等函數(shù)創(chuàng)建具有指定形狀和類型的多維數(shù)組遭殉。

import numpy as np

# 從列表創(chuàng)建多維數(shù)組
a = np.array([[1, 2, 3], [66, 77, 88]])
# 輸出:[[ 1  2  3] [66 77 88]]
print(a)

# 創(chuàng)建全部為0的多維數(shù)組
b = np.zeros((2, 3))
# 輸出:[[0. 0. 0.] [0. 0. 0.]]
print(b)
  
# 創(chuàng)建全部為1的多維數(shù)組
c = np.ones((2, 4), dtype = np.int32)
# 輸出:[[1 1 1 1] [1 1 1 1]]
print(c)

還可以使用numpy.arange()函數(shù)生成一個等差數(shù)列,類似于Python中的range()函數(shù)博助。該函數(shù)的語法格式為:
numpy.arange(start, stop, step, dtype)
其各個參數(shù)的含義如下险污。
start:起始值。
stop:終止值,生成的數(shù)列中最大的元素值蛔糯,不包括該值拯腮。
step:步長,兩個連續(xù)元素之間的差值蚁飒。
dtype:指定生成的數(shù)組的數(shù)據(jù)類型动壤。

import numpy as np

# 生成從0到5的整數(shù)數(shù)組
a = np.arange(6)
# 輸出:[0 1 2 3 4 5]
print(a)

# 生成從1開始,每次增加3淮逻,直到13的整數(shù)數(shù)組
b = np.arange(1, 13, 3)
# 輸出:[ 1  4  7 10]
print(b)
 
# 生成從0開始琼懊,每次增加0.2,直到1的浮點數(shù)數(shù)組
c = np.arange(0, 1, 0.2)
# 輸出:[0.  0.2 0.4 0.6 0.8]
print(c)

數(shù)組索引

在numpy模塊中爬早,可以使用方括號和逗號分隔的索引來訪問多維數(shù)組中的元素哼丈。索引主要分為四種類型,分別為:整數(shù)索引凸椿、切片索引削祈、布爾索引和花式索引。
整數(shù)索引:使用整數(shù)索引可以訪問多維數(shù)組中的特定元素脑漫。比如:對于一個二維數(shù)組a髓抑,a[0, 0]將訪問第一行第一列的元素。

import numpy as np

a = np.array([[1, 2, 3], [66, 77, 88]])
# 訪問第一行第一列的元素优幸,輸出:1
print(a[0, 0])
# 訪問第二行第三列的元素吨拍,輸出:88
print(a[1, 2])

切片索引:使用切片索引可以訪問多維數(shù)組中的一部分元素。比如:對于一個二維數(shù)組a网杆,a[0, :]將訪問第一行的所有元素羹饰。

import numpy as np

a = np.array([[1, 2, 3], [66, 77, 88]])
# 訪問第二行的所有元素,輸出:[66 77 88]
print(a[1, :])

布爾索引:使用布爾索引可以根據(jù)條件選擇多維數(shù)組中的某些元素碳却。比如 :對于一個二維數(shù)組a队秩,a[a > 5]將選擇所有大于5的元素。

import numpy as np

a = np.array([[1, 2, 3], [66, 77, 88]])
# 訪問大于2的所有元素昼浦,輸出:[ 3 66 77 88]
print(a[a > 2])

花式索引:使用花式索引可以根據(jù)指定的索引數(shù)組選擇多維數(shù)組中的元素馍资。比如:對于一個二維數(shù)組a,a[[0, 1], [0, 2]]將選擇第一行第一列和第二行第三列的元素(第一個中括號里為元素行號关噪,第二個中括號里為元素列號鸟蟹,兩個括號里的元素個數(shù)必須相同)。

import numpy as np

a = np.array([[1, 2, 3], [66, 77, 88]])
# 輸出:[ 1 88 77]
print(a[[0, 1, 1], [0, 2, 1]])

數(shù)組操作

numpy模塊提供了大量的數(shù)組操作函數(shù)使兔,比如:numpy.shape建钥、numpy.reshape()、numpy.transpose()等虐沥,可以很方便地進行數(shù)組形狀的改變熊经、轉(zhuǎn)置等操作。
numpy.shape屬性可用于獲取多維數(shù)組的形狀,numpy.reshape()函數(shù)可用于改變多維數(shù)組的形狀奈搜,numpy.size屬性可用于獲取多維數(shù)組中元素的個數(shù)悉盆。

import numpy as np

a = np.array([[1, 2, 3], [66, 77, 88]])
# 輸出:(2, 3)
print(a.shape)
# 輸出:6
print(a.size)
  
b = a.reshape(3, 2)
# 輸出:[[ 1  2] [ 3 66] [77 88]]
print(b)
# 輸出:6
print(b.size)

numpy.append()和numpy.insert()函數(shù)可用于在數(shù)組中添加元素,numpy.delete()函數(shù)可用于從數(shù)組中刪除元素馋吗,numpy.where()函數(shù)可用于返回滿足指定條件的元素的索引。

import numpy as np

arr = np.array([1, 2, 3])
new_arr = np.append(arr, 100)
# 在尾部添加數(shù)據(jù)秋秤,輸出:[  1   2   3 100]
print(new_arr)

new_arr = np.insert(arr, 1, 100)
# 在指定位置插入數(shù)據(jù)宏粤,輸出:[  1 100   2   3]
print(new_arr)

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# axis默認為None,會將數(shù)組展平到一維灼卢,并刪除第二個元素绍哎,輸出:[1 3 4 5 6 7 8 9]
new_arr = np.delete(arr, 1)
print(new_arr)

# 刪除第二行,輸出:[[1 2 3] [7 8 9]]
new_arr = np.delete(arr, 1, axis = 0)
print(new_arr)

# 刪除第二列鞋真,輸出:[[1 3] [4 6] [7 9]]
new_arr = np.delete(arr, 1, axis = 1)
print(new_arr)

arr = np.array([10, 20, 30, 40, 50])
indexes = np.where(arr > 20)
# 返回滿足條件的索引崇堰,輸出:(array([2, 3, 4], dtype=int64),)
print(indexes)

new_arr = np.where(arr > 20, 0, arr)
# 將滿足條件的元素替換為0,不滿足的元素保持不變涩咖,輸出:[10 20  0  0  0]
print(new_arr)

numpy.sort()函數(shù)可用于對數(shù)組進行排序海诲,numpy.concatenate()函數(shù)可用于連接多個數(shù)組。

import numpy as np

arr = np.array([3, 1, 4, 1, 5, 9, 2, 6])
new_arr = np.sort(arr)
# 默認升序排列檩互,輸出:[1 1 2 3 4 5 6 9]
print(new_arr)

arr = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])
new_arr = np.sort(arr, axis = 0)
# 輸出:[[3 2 1] [6 5 4] [9 8 7]]
print(new_arr)

new_arr = np.sort(arr, axis = 1)
# 輸出:[[7 8 9] [4 5 6] [1 2 3]]
print(new_arr)

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
new_arr = np.concatenate((arr1, arr2))
# 合并數(shù)組特幔,輸出:[1 2 3 4 5 6]
print(new_arr)

numpy.split(array, indices_or_sections, axis=0)函數(shù)可將數(shù)組按照指定位置或數(shù)量分割成多個子數(shù)組。indices_or_sections參數(shù)為一個整數(shù)或一個表示要分割的子數(shù)組數(shù)量的元組闸昨。如果它是一個整數(shù)蚯斯,則表示將數(shù)組分割成相等大小的子數(shù)組(除了最后一個可能較小)饵较。如果它是一個元組拍嵌,則表示每個子數(shù)組的大小。例如循诉,如果輸入 (3, 2, 1)横辆,則表示第一個子數(shù)組大小為3,第二個子數(shù)組大小為2打洼,第三個子數(shù)組大小為1龄糊。

import numpy as np

array = np.arange(6)
# 將數(shù)組分割成3個子數(shù)組,每個子數(shù)組大小相等募疮,輸出如下:
# Array 1: [0 1]
# Array 2: [2 3]
# Array 3: [4 5]
subarrays = np.split(array, 3)
for i, subarray in enumerate(subarrays):
    print(f"Array {i+1}:", subarray)

# 將數(shù)組分割成2個子數(shù)組炫惩,第一個子數(shù)組包含2個元素,輸出如下:
# Array 1: [0 1]
# Array 2: [2 3 4 5]
indices = (2, )
subarrays = np.split(array, indices)
for i, subarray in enumerate(subarrays):
    print(f"Array {i+1}:", subarray)

數(shù)學(xué)函數(shù)

數(shù)學(xué)函數(shù):numpy提供了大量的數(shù)學(xué)函數(shù)阿浓,可以對數(shù)組中的元素進行各種數(shù)學(xué)運算他嚷,如numpy.sin()、numpy.cos()、numpy.exp()等筋蓖。

import numpy as np

# 計算60度的余弦值
angle = np.array([60])
cos_value = np.cos(angle * np.pi / 180)
# 輸出:[0.5]
print(cos_value)
  
sequence = np.array([0, 30, 45, 60, 90])
sin_sequence = np.sin(sequence * np.pi / 180)
# 輸出:[0.         0.5        0.70710678 0.8660254  1.        ]
print(sin_sequence)

線性代數(shù)

線性代數(shù):numpy還提供了一些線性代數(shù)函數(shù)卸耘,如numpy.dot()、numpy.linalg.inv()等粘咖,可以方便地進行矩陣的點積蚣抗、逆矩陣等計算。

import numpy as np
  
a = np.array([1, 2, 3])  
b = np.array([4, 5, 6])  
result = np.dot(a, b)
# 計算點積瓮下,輸出:32
print(result)
 
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
result = np.dot(a, b)
# 計算二維數(shù)組的點積翰铡,輸出:[[19 22] [43 50]]
print(result)

隨機數(shù)生成

隨機數(shù)生成:numpy包含了大量的隨機數(shù)生成函數(shù),可以方便地生成各種分布的隨機數(shù)讽坏。

import numpy as np
  
random_float = np.random.rand()
# 生成[0, 1)范圍內(nèi)的隨機浮點數(shù)锭魔,輸出:0.58806166392493
print(random_float)

random_integer = np.random.randint(0, 10)
# 生成[0, 10)范圍內(nèi)的隨機整數(shù),輸出:9
print(random_integer)

random_array = np.random.rand(3)
# 生成長度為3的隨機浮點數(shù)數(shù)組路呜,數(shù)組中的數(shù)在[0, 1)范圍內(nèi)迷捧,輸出:[0.90723285 0.05028758 0.13100614]
print(random_array)

random_array = np.random.randint(0, 100, size = 3)
# 生成長度為3的隨機整數(shù)數(shù)組,數(shù)組中的數(shù)在[0, 100)范圍內(nèi)胀葱,輸出:[59 43 90]
print(random_array)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漠秋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子巡社,更是在濱河造成了極大的恐慌膛堤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晌该,死亡現(xiàn)場離奇詭異肥荔,居然都是意外死亡,警方通過查閱死者的電腦和手機朝群,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門燕耿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姜胖,你說我怎么就攤上這事誉帅。” “怎么了右莱?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵蚜锨,是天一觀的道長。 經(jīng)常有香客問我慢蜓,道長亚再,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任晨抡,我火速辦了婚禮氛悬,結(jié)果婚禮上则剃,老公的妹妹穿的比我還像新娘。我一直安慰自己如捅,他們只是感情好棍现,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镜遣,像睡著了一般己肮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悲关,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天朴肺,我揣著相機與錄音,去河邊找鬼坚洽。 笑死,一個胖子當(dāng)著我的面吹牛西土,可吹牛的內(nèi)容都是我干的讶舰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼需了,長吁一口氣:“原來是場噩夢啊……” “哼跳昼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肋乍,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鹅颊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后墓造,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堪伍,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年觅闽,在試婚紗的時候發(fā)現(xiàn)自己被綠了帝雇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛉拙,死狀恐怖尸闸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情孕锄,我是刑警寧澤吮廉,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站畸肆,受9級特大地震影響宦芦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恼除,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一踪旷、第九天 我趴在偏房一處隱蔽的房頂上張望曼氛。 院中可真熱鬧,春花似錦令野、人聲如沸舀患。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聊浅。三九已至,卻和暖如春现使,著一層夾襖步出監(jiān)牢的瞬間低匙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工碳锈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留顽冶,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓售碳,卻偏偏與公主長得像强重,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贸人,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

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