当使用ufunc函数对两个数组进行运算的时候,ufunc会对两个数组中两个对应函数进行运算,因此要求两个数组有大小相同的shape,如果两个数组的shape不同的话,会进行如下的广播处理:
让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐输出数组的shape是输入数组shape的各个轴上的最大值如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值 array([[ 0], [10], [20], [30], [40], [50]]) >>> b = arange(0,5) >>> b array([0, 1, 2, 3, 4]) >>> a.shape (6, 1) >>> b.shape (5,) >>> print a + b [[ 0 1 2 3 4] [10 11 12 13 14] [20 21 22 23 24] [30 31 32 33 34] [40 41 42 43 44] [50 51 52 53 54]]上述计算步骤是1,根据1把b.shape变为(1,5)
2.根据2把a.shape和 b.shape变为(6.5)之后在相加
ogrid对象
ogrid对象是一个非常有用的对象,它像一个多维数组一样,用切片组元作为下标进行存取,返回的是一组可以用来广播计算的数组,其切片下标有两种形式,
开始值:结束值:步长,和np.arange(开始值, 结束值, 步长)类似
开始值:结束值:长度j,当第三个参数为虚数时,它表示返回的数组的长度,和np.linspace(开始值, 结束值, 长度)类似
利用ogrid的返回值,我能很容易计算x, y网格面上各点的值,或者x, y, z网格体上各点的值。下面是绘制三维曲面 x * exp(x**2 - y**2) 的程序: import numpy as np from enthought.mayavi import mlab x, y = np.ogrid[-2:2:20j, -2:2:20j] z = x * np.exp( - x**2 - y**2) pl = mlab.surf(x, y, z, warp_scale="auto") mlab.axes(xlabel='x', ylabel='y', zlabel='z') mlab.outline(pl)1.更改数组的形状
>>> a = arange(9) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8]) >>> b = a.reshape(3,-1) #不改变自己形状 >>> b array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8]) >>> a.resize(3,3) #改变自己形状 >>> a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) 更多 shape, reshape, resize, ravel2.组合不同的数组
>>> a = arange(4).reshape(2,-1) >>> a array([[0, 1], [2, 3]]) >>> b = a.copy() >>> b array([[0, 1], [2, 3]]) >>> c = vstack((a,b)) >>> c array([[0, 1], [2, 3], [0, 1], [2, 3]]) >>> d = hstack((a,b)) >>> d array([[0, 1, 0, 1], [2, 3, 2, 3]]) vstack和hstack将两数组从不同轴组合数组更多函数hstack , vstack, column_stack , row_stack , concatenate , c_ , r_
3,将一个数组分割成几个数组
>>> a = floor(10*random.random((2,12))) >>> a array([[ 8., 8., 3., 9., 0., 4., 3., 0., 0., 6., 4., 4.], [ 0., 3., 2., 9., 6., 0., 4., 5., 7., 5., 1., 4.]]) >>> hsplit(a,3) # Split a into 3 [array([[ 8., 8., 3., 9.], [ 0., 3., 2., 9.]]), array([[ 0., 4., 3., 0.], [ 6., 0., 4., 5.]]), array([[ 0., 6., 4., 4.], [ 7., 5., 1., 4.]])] vsplit沿着纵向的轴分割, array split允许指定沿哪个轴分割。1.矩阵的创建
class numpy.matrix(data,dtype,copy):返回一个矩阵,其中data为ndarray对象或者字符形式;dtype:为data的type;copy:为bool类型
>>> a = np.matrix('1 2 7; 3 4 8; 5 6 9') >>> a #矩阵的换行必须是用分号(;)隔开,内部数据必须为字符串形式(‘ ’),矩 matrix([[1, 2, 7], #阵的元素之间必须以空格隔开。 [3, 4, 8], [5, 6, 9]]) >>> b=np.array([[1,5],[3,2]]) >>> x=np.matrix(b) #矩阵中的data可以为数组对象。 >>> x matrix([[1, 5], [3, 2]])2.矩阵的属性
3.矩阵运算
>>> a = matrix([1,2,3]) >>> a matrix([[1, 2, 3]]) >>> a = array([1,2,3]) >>> a array([1, 2, 3]) >>> b = mat(a) >>> b matrix([[1, 2, 3]])mat 把数组转化为矩阵 a2=a1.sum(axis=0);//列和,这里得到的是1*2的矩阵 a3=a1.sum(axis=1);//行和,这里得到的是3*1的矩阵此外还有 all,any等