八 广播
当使用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(开始值, 结束值, 长度)类似
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, ravel
2.组合不同的数组
>>> 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.矩阵的属性
matrix.T transpose:返回矩阵的转置矩阵
matrix.H hermitian (conjugate) transpose:返回复数矩阵的共轭元素矩阵
matrix.I inverse:返回矩阵的逆矩阵
matrix.A base array:返回矩阵基于的数组
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等