A01_[NumPy中文网]数组基础(创建数组,多维数组切片,数组属性)、使用数组(基本操作符,数组特殊运算符)、索引(花式索引,布尔索引,缺省索引)
NumPy簡單入門教程
NumPy是Python中的一個運(yùn)算速度非常快的一個數(shù)學(xué)庫,它非常重視數(shù)組。它允許你在Python中進(jìn)行向量和矩陣計算,并且由于許多底層函數(shù)實際上是用C編寫的,因此你可以體驗在原生Python中永遠(yuǎn)無法體驗到的速度。
NumPy絕對是科學(xué)Python成功的關(guān)鍵之一,如果你想要進(jìn)入Python中的數(shù)據(jù)科學(xué)和/或機(jī)器學(xué)習(xí),你就要必須學(xué)習(xí)它。在我看來,NumPy的API設(shè)計得很好,所以我們要開始使用它并不困難。
數(shù)組基礎(chǔ)
創(chuàng)建一個數(shù)組
NumPy圍繞這些稱為數(shù)組的事物展開。實際上它被稱之為 ndarrays,你不知道沒事兒。使用NumPy提供的這些數(shù)組,我們就可以以閃電般的速度執(zhí)行各種有用的操作,如矢量和矩陣、線性代數(shù)等數(shù)學(xué)運(yùn)算!
a = np.array([0,1,2,3,4]) b = np.array((0,1,2,3,4)) c = np.arange(5) d = np.linspace(0,2 * np.pi,5)print(np.pi) print(a) print(b) print(c) print(d)上面的代碼顯示了創(chuàng)建數(shù)組的4種不同方法。最基本的方法是將序列傳遞給NumPy的array()函數(shù); 你可以傳遞任何序列(類數(shù)組),而不僅僅是常見的列表(list)數(shù)據(jù)類型。
請注意,當(dāng)我們打印具有不同長度數(shù)字的數(shù)組時,它會自動將它們填充出來。這對于查看矩陣很有用。對數(shù)組進(jìn)行索引就像列表或任何其他Python序列一樣
上面的數(shù)組示例是如何使用NumPy表示向量的,接下來我們將看看如何使用多維數(shù)組表示矩陣和更多的信息。
a = np.array([[11, 12, 13, 14, 15],[16, 17, 18, 19, 20],[21, 22, 23, 24, 25],[26, 27, 28 ,29, 30],[31, 32, 33, 34, 35]]) print(a[2,4])運(yùn)行結(jié)果:25 a[2,4]表示取得3行,5列為了創(chuàng)建一個2D(二維)數(shù)組,我們傳遞一個列表的列表(或者是一個序列的序列)給array()函數(shù)。如果我們想要一個3D(三維)數(shù)組,我們就要傳遞一個列表的列表的列表,如果是一個4D(四維)數(shù)組,那就是列表的列表的列表的列表,以此類推。
它背后的一些數(shù)學(xué)知識
要正確理解這一點,我們應(yīng)該真正了解一下矢量和矩陣是什么。
矢量是具有方向和幅度的量。它們通常用于表示速度,加速度和動量等事物。向量可以用多種方式編寫,盡管對我們最有用的是它們被寫為n元組的形式,如(1,4,6,9)。這就是我們在NumPy中表示他們的方式。
矩陣類似于矢量,除了它由行和列組成; 很像一個網(wǎng)格。可以通過給出它所在的行和列來引用矩陣中的值。在NumPy中,我們通過傳遞一系列序列來制作數(shù)組,就像我們之前所做的那樣。
多維數(shù)組切片
切片多維數(shù)組比1D數(shù)組復(fù)雜一點,并且在使用NumPy時你也會經(jīng)常需要使用到。
import numpy as npa = np.array([[11, 12, 13, 14, 15],[16, 17, 18, 19, 20],[21, 22, 23, 24, 25],[26, 27, 28 ,29, 30],[31, 32, 33, 34, 35]])#取出第1行,2~5列并且不包含第5列的值 print(a[0,1:4]) #取出第1列,2-5行并且不包含第5列的值 print(a[1:4,0]) #表示行每隔2個取一個值,列每隔3個取一個值 print(a[::2,::3]) #表示取第二列的所有值 print(a[:,1])運(yùn)行結(jié)果:
[12 13 14] [16 21 26] [[11 14][21 24][31 34]] [12 17 22 27 32]如你所見,通過對每個以逗號分隔的維度執(zhí)行單獨的切片,你可以對多維數(shù)組進(jìn)行切片。因此,對于2D數(shù)組,我們的第一片定義了行的切片,第二片定義了列的切片。
注意,只需輸入數(shù)字就可以指定行或列。上面的第一個示例從數(shù)組中選擇第0列。
下面的圖表說明了給定的示例切片是如何進(jìn)行工作的。
數(shù)組屬性
在使用 NumPy 時,你會想知道數(shù)組的某些信息。很幸運(yùn),在這個包里邊包含了很多便捷的方法,可以給你想要的信息。
# Array properties a = np.array([[11, 12, 13, 14, 15],[16, 17, 18, 19, 20],[21, 22, 23, 24, 25],[26, 27, 28 ,29, 30],[31, 32, 33, 34, 35]])print(type(a)) # >>><class 'numpy.ndarray'> print(a.dtype) # >>>int64 print(a.size) # >>>25 print(a.shape) # >>>(5, 5) print(a.itemsize) # >>>4 print(a.ndim) # >>>2 print(a.nbytes) # >>>100正如你在上面的代碼中看到的,NumPy數(shù)組實際上被稱為ndarray。我不知道為什么他媽的它叫ndarray,如果有人知道請留言!我猜它代表n維數(shù)組。
數(shù)組的形狀是它有多少行和列,上面的數(shù)組有5行和5列,所以它的形狀是(5,5)。
itemsize屬性是每個項占用的字節(jié)數(shù)。這個數(shù)組的數(shù)據(jù)類型是int 64,一個int 64中有64位,一個字節(jié)中有8位,除以64除以8,你就可以得到它占用了多少字節(jié),在本例中是8。
ndim 屬性是數(shù)組的維數(shù)。這個有2個。例如,向量只有1。
nbytes 屬性是數(shù)組中的所有數(shù)據(jù)消耗掉的字節(jié)數(shù)。你應(yīng)該注意到,這并不計算數(shù)組的開銷,因此數(shù)組占用的實際空間將稍微大一點。
使用數(shù)組
基本操作符
只是能夠從數(shù)組中創(chuàng)建和檢索元素和屬性不能滿足你的需求,你有時也需要對它們進(jìn)行數(shù)學(xué)運(yùn)算。 你完全可以使用四則運(yùn)算符 +、- 、/ 來完成運(yùn)算操作。
a = np.arange(25) print("a:") print(a)a = a.reshape((5,5)) print("a:") print(a)b = np.array([10, 62, 1, 14, 2, 56, 79, 2, 1, 45,4, 92, 5, 55, 63, 43, 35, 6, 53, 24,56, 3, 56, 44, 78])b = b.reshape((5,5)) print("b:") print(b)print("a + b:") print(a + b) print("a - b:") print(a - b) print("a * b:") print(a * b) print("a / b:") print(a / b) print("a ** 2:") print(a ** 2) print("a < b:") print(a < b) print("a > b:") print(a > b) print("a.dot(b):") print(a.dot(b))除了 dot() 之外,這些操作符都是對數(shù)組進(jìn)行逐元素運(yùn)算。比如 (a, b, c) + (d, e, f) 的結(jié)果就是 (a+d, b+e, c+f)。它將分別對每一個元素進(jìn)行配對,然后對它們進(jìn)行運(yùn)算。它返回的結(jié)果是一個數(shù)組。注意,當(dāng)使用邏輯運(yùn)算符比如 “<” 和 “>” 的時候,返回的將是一個布爾型數(shù)組,這點有一個很好的用處,后邊我們會提到。
dot() 函數(shù)計算兩個數(shù)組的點積。它返回的是一個標(biāo)量(只有大小沒有方向的一個值)而不是數(shù)組。
它背后的一些數(shù)學(xué)知識
dot()函數(shù)稱為點積。理解這一點的最好方法是看下圖,下圖將表示它是如何進(jìn)行計算的。
數(shù)組特殊運(yùn)算符
NumPy還提供了一些別的用于處理數(shù)組的好用的運(yùn)算符。
# dot,sum,min,max,cumsum a = np.arange(10)print(a) print(a.sum()) print(a.min()) print(a.max()) print(a.cumsum())運(yùn)行結(jié)果:
[0 1 2 3 4 5 6 7 8 9] 45 0 9 [ 0 1 3 6 10 15 21 28 36 45]sum()、min()和max()函數(shù)的作用非常明顯。將所有元素相加,找出最小和最大元素。
然而,cumsum()函數(shù)就不那么明顯了。它將像sum()這樣的每個元素相加,但是它首先將第一個元素和第二個元素相加,并將計算結(jié)果存儲在一個列表中,然后將該結(jié)果添加到第三個元素中,然后再將該結(jié)果存儲在一個列表中。這將對數(shù)組中的所有元素執(zhí)行此操作,并返回作為列表的數(shù)組之和的運(yùn)行總數(shù)。
索引進(jìn)階
花式索引
花式索引是獲取數(shù)組中我們想要的特定元素的有效方法。
#Fancy indexing a = np.arange(0,100,10) print(a) #[ 0 10 20 30 40 50 60 70 80 90]indices = [1,5,-1] b = a[indices] print(b) #[10 50 90]正如你在上面的示例中所看到的,我們使用我們想要檢索的特定索引序列對數(shù)組進(jìn)行索引。這反過來返回我們索引的元素的列表。
布爾屏蔽
布爾屏蔽是一個有用的功能,它允許我們根據(jù)我們指定的條件檢索數(shù)組中的元素。
import numpy as np import matplotlib.pyplot as plta = np.linspace(0, 2 * np.pi, 50) b = np.sin(a) plt.plot(a,b) mask = b >= 0 plt.plot(a[mask], b[mask], 'bo') mask = (b >= 0) & (a <= np.pi / 2) plt.plot(a[mask], b[mask], 'go') plt.show()缺省索引
不完全索引是從多維數(shù)組的第一個維度獲取索引或切片的一種方便方法。例如,如果數(shù)組a=[1,2,3,4,5],[6,7,8,9,10],那么[3]將在數(shù)組的第一個維度中給出索引為3的元素,這里是值4。
import numpy as np# Incomplete Indexing a = np.arange(0,100,10) b = a[:5] c = a[a >= 50] print(b) print(c)Where函數(shù)
where() 函數(shù)是另外一個根據(jù)條件返回數(shù)組中的值的有效方法。只需要把條件傳遞給它,它就會返回一個使得條件為真的元素的列表。
import numpy as npa = np.arange(0,100,10) print(a) #取出的是a < 50的數(shù)組下標(biāo) b = np.where(a < 50) # 取出a >= 50的數(shù)組下標(biāo) c = np.where(a >= 50)[0] print(b) #(array([0, 1, 2, 3, 4], dtype=int64),) print(c) #[5 6 7 8 9]這就是NumPy,沒那么難吧?當(dāng)然,這篇文章只涵蓋了入門的基礎(chǔ)知識,在NumPy中你還可以做許多其他好玩的事情,當(dāng)你已經(jīng)熟悉了NumPy的基礎(chǔ)知識,你就可以開始自由的探索NumPy的世界了。
總結(jié)
以上是生活随笔為你收集整理的A01_[NumPy中文网]数组基础(创建数组,多维数组切片,数组属性)、使用数组(基本操作符,数组特殊运算符)、索引(花式索引,布尔索引,缺省索引)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 福特汽车缸内直喷技术的英文缩写是?
- 下一篇: 雪铁龙19款雨眉和22款雨眉区别?