日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NumPy快速入门-- Less 基础/线性代数

發布時間:2024/7/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NumPy快速入门-- Less 基础/线性代数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 廣播(Broadcasting)規則
    • 2. 使用索引數組索引
    • 3. 使用布爾值作為數組索引
    • 4. ix_()函數
    • 5. 線性代數 簡單數組操作
    • 6. 技巧和提示
      • 6.1 “自動”整形
      • 6.2 矢量堆疊

1. 廣播(Broadcasting)規則

Broadcasting允許通用函數以有意義的方式處理具有不完全相同形狀的輸入。

  • 第一個規則,如果所有輸入數組不具有相同數量的維度,則“1”將被重復地添加到較小數組的形狀,直到所有數組具有相同數量的維度

  • 第二個規則,確保沿著特定維度具有大小為1的數組表現得好像它們具有沿著該維度具有最大形狀的數組的大小。假定數組元素的值沿“Broadcasting”數組的該維度相同。

在應用廣播規則之后,所有陣列的大小必須匹配。

(以上不是特別明白)

2. 使用索引數組索引

>>> 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)
  • 當被索引的數組 a 是一個多維數組,單個索引數組指的是 a 的第一個維度。以下示例通過使用調色板將標簽圖像轉換為彩色圖像來作為舉例。
>>> palette = np.array([[0,0,0],[255,0,0],[0,255,0],[0,0,255],[255,255,255]]) >>> image = np.array([[0,1,2,0],[0,3,4,0]]) >>> palette[image] array([[[ 0, 0, 0],[255, 0, 0],[ 0, 255, 0],[ 0, 0, 0]],[[ 0, 0, 0],[ 0, 0, 255],[255, 255, 255],[ 0, 0, 0]]])
  • 也可以給出多個維度的索引。每個維度的索引數組必須具有相同的形狀。
>>> a = np.arange(12).reshape(3,4) >>> a array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]]) >>> i = np.array([[0,1],[1,2]]) #行 >>> j = np.array([[2,1],[3,3]]) #列 >>> a[i,j] # i,j 必須有相同的shape array([[ 2, 5],[ 7, 11]]) >>> >>> a[i,2] array([[ 2, 6],[ 6, 10]]) >>> >>> a[:,j] #行和列的組合(0行所有的j...) array([[[ 2, 1],[ 3, 3]],[[ 6, 5],[ 7, 7]],[[10, 9],[11, 11]]])
  • 當然,我們可以把 i 和 j 放在一個序列中(比如一個列表), 然后用列表進行索引。
>>> l = [i,j] >>> a[l] array([[ 2, 5], # 等效于 a[i,j][ 7, 11]])
  • 不能將 i 和 j 放入一個數組中,因為這個數組將被解釋為索引第一個維度。
>>> s = np.array([i,j]) >>> s array([[[0, 1],[1, 2]],[[2, 1],[3, 3]]]) >>> a[s] Traceback (most recent call last):File "<pyshell#36>", line 1, in <module>a[s] IndexError: index 3 is out of bounds for axis 0 with size 3 >>> a[tuple(s)] # 與 a[i,j] 一樣 array([[ 2, 5],[ 7, 11]])
  • 索引數組的另一個常見用途是搜索時間相關序列的最大值

>>> time_max = time[idx] >>> data_max = data[idx, range(data.shape[1])] # => data[idx[0],0], data[idx[1],1]... >>> time_max array([ 82.5 , 20. , 113.75, 51.25]) >>> data_max array([0.98935825, 0.84147098, 0.99060736, 0.6569866 ]) >>> np.all(data_max == data.max(axis=0)) True
  • 還可以使用數組索引作為目標來賦值
>>> a = np.arange(5) >>> a array([0, 1, 2, 3, 4]) >>> a[[1,2,3]] = 0 >>> a array([0, 0, 0, 0, 4])
  • 當索引列表包含重復時,賦值多次,只留最后一個值
>>> a = np.arange(5) >>> a[[0,0,2]] = [1,2,3] # a[0]=1,a[0]=2,a[2]=3 >>> a array([2, 1, 3, 3, 4])
  • 使用Python的 += 構造要小心,可能得不到你想要的效果
>>> a array([0, 1, 2, 3, 4]) >>> a[[0,0,2]] += 1 # a[0] 只加了1次 >>> a array([1, 1, 3, 3, 4])

即使0在索引列表中出現2次,第0個元素只會增加一次。這是因為Python要求“a + = 1”等同于“a = a + 1”

3. 使用布爾值作為數組索引

使用布爾值作為索引時,我們明確地選擇數組中的哪些元素我們想要的,哪些不是。

我們可以想到的布爾索引最自然的方式是使用與原始數組具有相同形狀的布爾數組

>>> 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])
  • 此屬性在賦值時非常有用
>>> a[b] = 0 # a中大于4的元素賦值為0 >>> a array([[0, 1, 2, 3],[4, 0, 0, 0],[0, 0, 0, 0]])

使用布爾索引生成 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()


第二種使用布爾索引的方法更類似于整數索引; 對于數組的每個維度,給出一個一維布爾數組,選擇我們想要的切片

>>> a = np.arange(12).reshape(3,4) >>> b1 = np.array([False,True,True]) # 第一軸長度3=a中的3 >>> b2 = np.array([True,False,True,False]) # 第二軸長度4=a中的4 >>> >>> a[b1,:] # 選擇b1內true的行 array([[ 4, 5, 6, 7],[ 8, 9, 10, 11]]) >>> >>> a[b1] # 同上 array([[ 4, 5, 6, 7],[ 8, 9, 10, 11]]) >>> >>> a[:,b2] # 選擇b2內true的列 array([[ 0, 2],[ 4, 6],[ 8, 10]]) >>> >>> a[b1,b2] # 奇怪的結果!!! array([ 4, 10])

1D布爾數組的長度必須與你要切片的維度(或軸)的長度一致。b1 是rank為1的數組,其長度為3( a 中行的數量), b2 (長度4)適合于索引 a 的第二個rank(列)。

4. ix_()函數

可以使用 ix_ 函數來組合不同的向量以獲得每個n-uplet的結果。例如,如果要計算從向量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的優點是它使用Broadcasting規則,以避免創建參數數組輸出的大小乘以向量的數量。

>>> 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. 線性代數 簡單數組操作

>>> a = np.array([[1.0,2.0],[3.0,4.0]]) >>> print(a) [[1. 2.][3. 4.]] >>> a.transpose() #轉置 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])

總結

以上是生活随笔為你收集整理的NumPy快速入门-- Less 基础/线性代数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。