numpy數組運算


加、減、乘、除、指數運算、求倒數、取相反數、位運算   等各種運算都是在各個元素上分別進行的

加法

>>> a=numpy.array([2,4,5])
>>> b=numpy.array([1,1,1])
>>> a+b
array([3, 5, 6])

乘法

>>> a*b
array([2, 4, 5])

倒數

>>> 1./a
array([ 0.5 , 0.25, 0.2 ])

相反數

>>> -a
array([-2, -4, -5])

平方 

>>> a**2
array([ 4, 16, 25])

按位異或

>>> a^2
array([0, 6, 7])

指數運算

>>> numpy.exp(a)
array([ 7.3890561 , 54.59815003, 148.4131591 ])

真正的矩陣乘法需要用numpy.dot(A,B) 

>>> a=numpy.array([2,4,5])
>>> b=numpy.array([[1],[1],[1]])
>>> c=numpy.dot(a,b)
>>> c 
array([11])

兩個數據維度不一致時,低維數據會自動進行維度的擴充

>>> x=numpy.array([1,1,1])
>>> w=numpy.array([[1,2,3],[4,5,6]])
>>> z=w*x 
>>> z 
array([[1, 2, 3],
       [4, 5, 6]])

我們說numpy中的*表示矩陣相應位置上的元素分別相乘,可上例中w中2維的,而x才是1維。x的維度低,此時x會在第2個維度上自動擴充(即拷貝第一行的元素到第二行)。這等價於:

>>> x=numpy.array([[1,1,1],[1,1,1]])
>>> w=numpy.array([[1,2,3],[4,5,6]])
>>> z=w*x
>>> z 
array([[1, 2, 3],
       [4, 5, 6]])

同樣,加法運算低維的數據也會自動向高維以復制的方式進行擴充。

>>> a=numpy.array([2,3])
>>> b=1+a 
>>> b 
array([3, 4])

智能選擇維度進行擴充

>>> a=np.array([[1.,2.],[3.,4.],[5.,6.]])
>>> b=np.array([1.,2.])
>>> a/b 
array([[ 1.,  1.],
       [ 3.,  2.],
       [ 5.,  3.]])
>>> b=np.array([[1.,2.]])
>>> a/b 
array([[ 1.,  1.],
       [ 3.,  2.],
       [ 5.,  3.]])
>>> b=np.array([[1.],[2.],[3.]])
>>> a/b 
array([[ 1.        ,  2.        ],
       [ 1.5       ,  2.        ],
       [ 1.66666667,  2.        ]])

我們看到,a是3*2的矩陣,numpy.ndarray的“/”操作是對應位置上的元素分別進行除操作。當b是1*2的矩陣時,b為了跟a對齊它會自動在axis=1的方向上進行擴充;當b是3*1的矩陣時,b為了跟a對齊它會自動在axis=0的方向上進行擴充

外積

>>> a=np.array([[1,2,3],[4,5,6]])
>>> b=np.array([1,2])
>>> np.outer(b,a)
array([[ 1,  2,  3,  4,  5,  6],
       [ 2,  4,  6,  8, 10, 12]])
>>> b=np.array([[1],[2]])
>>> np.outer(b,a)
array([[ 1,  2,  3,  4,  5,  6],
       [ 2,  4,  6,  8, 10, 12]])

外積運算與兩個矩陣的shape無關,只與兩個矩陣中元素的多少有關。

c=np.outer(b,a)

b中有m個元素,a中有n個元素,則c的shape為(m,n),$c_{ij}=b中的第i個元素*a中的第j個元素$

一維數組與二維數組

>>> a=np.array([1,2,3])
>>> b=np.array([[1,2,3]])
>>> list(a)
[1, 2, 3]
>>> list(b)
[array([1, 2, 3])]
>>> a.shape 
(3,)
>>> b.shape 
(1, 3)
>>> a.T 
array([1, 2, 3])
>>> b.T 
array([[1],
       [2],
       [3]])

a是一維數組,b是二維數組。a比較特殊:a的轉置還是它本身,而且a.shape在第2維上沒有值。

最后來一個綜合練習,自己一步一步體會:

$$y=\frac{1}{1+e^{-W*X^T}}$$

>>> x=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
>>> w=numpy.array([0.3,0.8,1.2])
>>> y=1.0/(1.0+numpy.exp(-w*x.T))
>>> y
array([[ 0.57444252, 0.96083428, 0.99977518],
[ 0.64565631, 0.98201379, 0.99993228],
[ 0.7109495 , 0.99183743, 0.9999796 ]])

 shape

注意一維數組和只有一行的二維數組的區別

>>> b=np.array([3,6])
>>> d=np.array([[3,6]])
>>> b.shape
(2,)
>>> d.shape
(1, 2)
>>> b[1]
6
>>> d[0,1]
6

一維數組轉置后其shape不變

>>> b.T.shape
(2,)
>>> d.T.shape
(2, 1)

通過切片取二維數組的第i行時,x[i]和x[i,:]是等價的,得到的都是一個一維數組,而x[i:i+1,:]得到的是只有一行的二維數組

>>> a=np.array([[2,4],[5,7]])
>>> a[0]
array([2, 4])
>>> a[0,:]
array([2, 4])
>>> a[0:1,:]
array([[2, 4]])

np.sun(ndarray)函數不指定axis參數時是對數組中的所有元素求總和;指定axis參數時可以按行/按列求和,求和的結果相比於原數組降低了一個維度。

>>> np.sum(a)
18
>>> np.sum(a,axis=0)
array([ 7, 11])
>>> np.sum(a,axis=1)
array([ 6, 12])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM