加、減、乘、除、指數運算、求倒數、取相反數、位運算 等各種運算都是在各個元素上分別進行的
加法
>>> 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])