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