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])

 

posted @ 2017-06-25 16:24  高性能golang  阅读(14595)  评论(0编辑  收藏  举报