日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

NumPy

 imelee 2017-04-10

本文摘自《用Python做科學計算》,版權歸原作者所有。

1. NumPy-快速處理數據--ndarray對象--數組的創(chuàng)建和存取

2. NumPy-快速處理數據--ndarray對象--多維數組的存取、結構體數組存取、內存對齊、Numpy內存結構

3. NumPy-快速處理數據--ufunc運算--廣播--ufunc方法

接下來介紹矩陣運算

Numpy默認不使用矩陣運算,如果希望對數組進行矩陣運算的話需要調用相應的函數

matrix 對象

numpy庫提供了matrix類,使用matrix類創(chuàng)建的是矩陣對象,它們的加減乘除運算缺省采用矩陣方式計算,因此用法和matlab十分類似。但是由于NumPy中同時存在ndarray和matrix對象,因此用戶很容易將兩者弄混。這有違Python的“顯式優(yōu)于隱式”的原則,因此并不推薦在較復雜的程序中使用matrix。下面是使用matrix的一個例子:

復制代碼
 1 >>> import numpy as np
 2 >>> a = np.matrix([[1,2,3],[5,5,6],[7,9,9]])
 3 >>> a**-1     # a 的逆矩陣
 4 matrix([[-0.6       ,  0.6       , -0.2       ],
 5         [-0.2       , -0.8       ,  0.6       ],
 6         [ 0.66666667,  0.33333333, -0.33333333]])
 7 >>> a * a**-1 # a與a的逆矩陣的乘積,結果是單位陣
 8 matrix([[  1.00000000e+00,   0.00000000e+00,   0.00000000e+00],
 9         [  4.44089210e-16,   1.00000000e+00,   4.44089210e-16],
10         [  0.00000000e+00,  -4.44089210e-16,   1.00000000e+00]])
復制代碼

如果不使用matrix 對象,而把二維數組看作是矩陣的話,就需要使用dot函數進行計算。對于二維數組,它計算的是矩陣乘積,對于一維數組,它計算的是其點積。當需要將一維數組當作列矢量或者行矢量進行矩陣運算時,推薦先使用reshape或者shape函數將一維數組轉換為二維數組:

復制代碼
 1 >>> a = np.array([1, 2, 3])
 2 >>> a.shape#a是一維數組
 3 (3,)
 4 >>> a.shape = (-1, 1)#使用shape直接修改a的維數
 5 >>> a
 6 array([[1],
 7        [2],
 8        [3]])
 9 >>> a.reshape(1, -1) #使用reshape也可以,但是他的返回值改變a的shape,而a本身不變
10 array([[1, 2, 3]])
11 >>> a
12 array([[1],
13        [2],
14        [3]])
復制代碼
  • dot :對于兩個一維的數組,計算的是這兩個數組對應下標元素的乘積和(數學上稱之為內積);對于二維數組,計算的是兩個數組的矩陣乘積;對于多維數組,它的通用計算公式如下,即結果數組中的每個元素都是:數組a的最后一維上的所有元素與數組b的倒數第二位上的所有元素的乘積和:

dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

兩個三維數組相乘

復制代碼
 1 >>> a = np.arange(12).reshape(2,3,2)
 2 >>> a
 3 array([[[ 0,  1],
 4         [ 2,  3],
 5         [ 4,  5]],
 6 
 7        [[ 6,  7],
 8         [ 8,  9],
 9         [10, 11]]])
10 >>> b = np.arange(12,24).reshape(2,2,3)
11 >>> b
12 array([[[12, 13, 14],
13         [15, 16, 17]],
14 
15        [[18, 19, 20],
16         [21, 22, 23]]])
17 >>> c = np.dot(a,b)
18 >>> c
19 array([[[[ 15,  16,  17],
20          [ 21,  22,  23]],
21 
22         [[ 69,  74,  79],
23          [ 99, 104, 109]],
24 
25         [[123, 132, 141],
26          [177, 186, 195]]],
27 
28 
29        [[[177, 190, 203],
30          [255, 268, 281]],
31 
32         [[231, 248, 265],
33          [333, 350, 367]],
34 
35         [[285, 306, 327],
36          [411, 432, 453]]]])
37 >>> c.shape
38 (2, 3, 2, 3)
復制代碼

dot乘積的結果c可以看做是數組a, b的多個子矩陣的乘積:

復制代碼
1 >>> np.alltrue( c[0,:,0,:] == np.dot(a[0],b[0]) )
2 True
3 >>> np.alltrue( c[1,:,0,:] == np.dot(a[1],b[0]) )
4 True
5 >>> np.alltrue( c[0,:,1,:] == np.dot(a[0],b[1]) )
6 True
7 >>> np.alltrue( c[1,:,1,:] == np.dot(a[1],b[1]) )
8 True
復制代碼
  • inner : 和dot乘積一樣,對于兩個一維數組,計算的是這兩個數組對應下標元素的乘積和;對于多維數組,它計算的結果數組中的每個元素都是:數組a和b的最后一維的內積,因此數組a和b的最后一維的長度必須相同:

1 inner(a, b)[i,j,k,m] = sum(a[i,j,:]*b[k,m,:])
復制代碼
 1 >>> a = np.arange(12).reshape(2,3,2)
 2 >>> b = np.arange(12,24).reshape(2,3,2)
 3 >>> c = np.inner(a,b)
 4 >>> c.shape
 5 (2, 3, 2, 3)
 6 >>> c[0,0,0,0] == np.inner(a[0,0],b[0,0])
 7 True
 8 >>> c[0,1,1,0] == np.inner(a[0,1],b[1,0])
 9 True
10 >>> c[1,2,1,2] == np.inner(a[1,2],b[1,2])
11 True
復制代碼
  • outer : 只按照一維數組進行計算,如果傳入參數是多維數組,則先將此數組展平為一維數組之后再進行運算。outer乘積計算的列向量和行向量的矩陣乘積:

1 >>> np.outer([1,2,3],[4,5,6,7])
2 array([[ 4,  5,  6,  7],
3        [ 8, 10, 12, 14],
4        [12, 15, 18, 21]])

矩陣中更高級的一些運算可以在NumPy的線性代數子庫linalg中找到。例如inv函數計算逆矩陣,solve函數可以求解多元一次方程組。下面是solve函數的一個例子:

1 >>> a = np.random.rand(10,10)
2 >>> b = np.random.rand(10)
3 >>> x = np.linalg.solve(a,b)

solve函數有兩個參數a和b。a是一個N*N的二維數組,而b是一個長度為N的一維數組,solve函數找到一個長度為N的一維數組x,使得a和x的矩陣乘積正好等于b,數組x就是多元一次方程組的解。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多