概述
在上一節(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)