NumPy快速入门-- Less 基础/线性代数
文章目錄
- 1. 廣播(Broadcasting)規(guī)則
- 2. 使用索引數(shù)組索引
- 3. 使用布爾值作為數(shù)組索引
- 4. ix_()函數(shù)
- 5. 線性代數(shù) 簡單數(shù)組操作
- 6. 技巧和提示
- 6.1 “自動”整形
- 6.2 矢量堆疊
1. 廣播(Broadcasting)規(guī)則
Broadcasting允許通用函數(shù)以有意義的方式處理具有不完全相同形狀的輸入。
-
第一個規(guī)則,如果所有輸入數(shù)組不具有相同數(shù)量的維度,則“1”將被重復地添加到較小數(shù)組的形狀,直到所有數(shù)組具有相同數(shù)量的維度。
-
第二個規(guī)則,確保沿著特定維度具有大小為1的數(shù)組表現(xiàn)得好像它們具有沿著該維度具有最大形狀的數(shù)組的大小。假定數(shù)組元素的值沿“Broadcasting”數(shù)組的該維度相同。
在應用廣播規(guī)則之后,所有陣列的大小必須匹配。
(以上不是特別明白)
2. 使用索引數(shù)組索引
>>> a = np.arange(12)**2 >>> a array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121],dtype=int32) >>> i = np.array([1,1,3,8,5]) >>> a[i] array([ 1, 1, 9, 64, 25], dtype=int32) >>> >>> j = np.array([[3,4],[9,7]]) >>> a[j] # a[j] 形狀與 j 一致 array([[ 9, 16],[81, 49]], dtype=int32)- 當被索引的數(shù)組 a 是一個多維數(shù)組,單個索引數(shù)組指的是 a 的第一個維度。以下示例通過使用調(diào)色板將標簽圖像轉(zhuǎn)換為彩色圖像來作為舉例。
- 也可以給出多個維度的索引。每個維度的索引數(shù)組必須具有相同的形狀。
- 當然,我們可以把 i 和 j 放在一個序列中(比如一個列表), 然后用列表進行索引。
- 不能將 i 和 j 放入一個數(shù)組中,因為這個數(shù)組將被解釋為索引第一個維度。
- 索引數(shù)組的另一個常見用途是搜索時間相關序列的最大值
- 還可以使用數(shù)組索引作為目標來賦值
- 當索引列表包含重復時,賦值多次,只留最后一個值
- 使用Python的 += 構(gòu)造要小心,可能得不到你想要的效果
即使0在索引列表中出現(xiàn)2次,第0個元素只會增加一次。這是因為Python要求“a + = 1”等同于“a = a + 1”
3. 使用布爾值作為數(shù)組索引
使用布爾值作為索引時,我們明確地選擇數(shù)組中的哪些元素我們想要的,哪些不是。
我們可以想到的布爾索引最自然的方式是使用與原始數(shù)組具有相同形狀的布爾數(shù)組
>>> a = np.arange(12).reshape(3,4) >>> a array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]]) >>> b = a > 4 >>> b array([[False, False, False, False],[False, True, True, True],[ True, True, True, True]]) >>> a[b] # 取出true的元素 array([ 5, 6, 7, 8, 9, 10, 11])- 此屬性在賦值時非常有用
使用布爾索引生成 Mandelbrot 集的圖像(不懂)
import numpy as np import matplotlib.pyplot as plt def mandelbrot(h,w,maxit=20):# Returns an image of the Mandelbrot fractal of size (h,w)y,x = np.ogrid[-1.4:1.4:h*1j, -2:0.8:w*1j]c = x+y*1jz = cdivtime = maxit + np.zeros(z.shape, dtype=int)for i in range(maxit):z = z**2 + cdiverge = z*np.conj(z) > 2**2div_now = diverge & (divtime==maxit)divtime[div_now] = iz[diverge] = 2return divtimeplt.imshow(mandelbrot(400,400)) plt.show()
第二種使用布爾索引的方法更類似于整數(shù)索引; 對于數(shù)組的每個維度,給出一個一維布爾數(shù)組,選擇我們想要的切片
1D布爾數(shù)組的長度必須與你要切片的維度(或軸)的長度一致。b1 是rank為1的數(shù)組,其長度為3( a 中行的數(shù)量), b2 (長度4)適合于索引 a 的第二個rank(列)。
4. ix_()函數(shù)
可以使用 ix_ 函數(shù)來組合不同的向量以獲得每個n-uplet的結(jié)果。例如,如果要計算從向量a、b和c中的取得的所有三元組的所有a + b * c
>>> a = np.array([2,3,4,5]) >>> b = np.array([8,5,4]) >>> c = np.array([5,4,6,8,3])>>> ax,bx,cx = np.ix_(a,b,c) # 分別取對應的,組合>>> ax array([[[2]],[[3]],[[4]],[[5]]]) >>> bx array([[[8],[5],[4]]]) >>> cx array([[[5, 4, 6, 8, 3]]]) >>> ax.shape, bx.shape, cx.shape ((4, 1, 1), (1, 3, 1), (1, 1, 5))>>> result = ax+bx*cx >>> result array([[[42, 34, 50, 66, 26],[27, 22, 32, 42, 17],[22, 18, 26, 34, 14]],[[43, 35, 51, 67, 27],[28, 23, 33, 43, 18],[23, 19, 27, 35, 15]],[[44, 36, 52, 68, 28],[29, 24, 34, 44, 19],[24, 20, 28, 36, 16]],[[45, 37, 53, 69, 29],[30, 25, 35, 45, 20],[25, 21, 29, 37, 17]]]) >>> result[3,2,4] 17 >>> a[3]+b[2]*c[4] 17以下版本的reduce的優(yōu)點是它使用Broadcasting規(guī)則,以避免創(chuàng)建參數(shù)數(shù)組輸出的大小乘以向量的數(shù)量。
>>> def func(f, *vectors):vs = np.ix_(*vectors)r = f.identityfor v in vs:r = f(r,v)return r>>> func(np.add,a,b,c) array([[[15, 14, 16, 18, 13],[12, 11, 13, 15, 10],[11, 10, 12, 14, 9]],[[16, 15, 17, 19, 14],[13, 12, 14, 16, 11],[12, 11, 13, 15, 10]],[[17, 16, 18, 20, 15],[14, 13, 15, 17, 12],[13, 12, 14, 16, 11]],[[18, 17, 19, 21, 16],[15, 14, 16, 18, 13],[14, 13, 15, 17, 12]]])5. 線性代數(shù) 簡單數(shù)組操作
>>> a = np.array([[1.0,2.0],[3.0,4.0]]) >>> print(a) [[1. 2.][3. 4.]] >>> a.transpose() #轉(zhuǎn)置 array([[1., 3.],[2., 4.]]) >>> np.linalg.inv(a) #矩陣求逆 array([[-2. , 1. ],[ 1.5, -0.5]])>>> u = np.eye(2) #對角線是1 >>> u array([[1., 0.],[0., 1.]]) >>> j = np.array([[0.0,-1.0],[1.0,0.0]]) >>> np.dot(j,j) #矩陣點積 array([[-1., 0.],[ 0., -1.]]) >>> np.trace(u) 2.0 >>> y = np.array([[5.0],[7.0]]) >>> np.linalg.solve(a,y) # 求解矩陣方程 array([[-3.],[ 4.]]) >>> np.linalg.eig(j) (array([0.+1.j, 0.-1.j]), array([[0.70710678+0.j , 0.70710678-0.j ],[0. -0.70710678j, 0. +0.70710678j]]))6. 技巧和提示
6.1 “自動”整形
可以省略一個維度的尺寸,由其自動計算出來
>>> a = np.arange(30) >>> a.shape = 2,-1,3 # -1 表示自行推導,省略 >>> a.shape (2, 5, 3) >>> a array([[[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11],[12, 13, 14]],[[15, 16, 17],[18, 19, 20],[21, 22, 23],[24, 25, 26],[27, 28, 29]]])6.2 矢量堆疊
column_stack,dstack,hstack,vstack
>>> x = np.arange(0,10,2) #array([0, 2, 4, 6, 8]) >>> y = np.arange(5) #array([0, 1, 2, 3, 4]) >>> m = np.vstack([x,y]) >>> m array([[0, 2, 4, 6, 8],[0, 1, 2, 3, 4]]) >>> xy = np.hstack([x,y]) >>> xy array([0, 2, 4, 6, 8, 0, 1, 2, 3, 4])總結(jié)
以上是生活随笔為你收集整理的NumPy快速入门-- Less 基础/线性代数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 26. 删除排序数组中
- 下一篇: LeetCode 78. 子集(回溯)