读书笔记3数组的一些常用函数
一、产生一些常用数组
ones((m,n),dtype),zeros((m,n),dtype),empty((m,n),dtype),eye(n),random.randn(m,n)
x = ones((M,N), dtype=’int32’) # 32-bit integers
print np.ones((2,3)),'\n' print np.zeros((2,3)),'\n'; print np.empty((2,3)),'\n' print np.eye(4) [[ 1. 1. 1.] [ 1. 1. 1.]] [[ 0. 0. 0.] [ 0. 0. 0.]] [[ 0. 0. 0.] [ 0. 0. 0.]] [[ 1. 0. 0. 0.] [ 0. 1. 0. 0.] [ 0. 0. 1. 0.] [ 0. 0. 0. 1.]]
二、类型转换
asarray#讲矩阵转换成数组形式
asmatrix#将数组转换成矩阵形式
2、矩阵的逆和矩阵的秩
A.I#求的是矩阵的逆
np.linalg.det(A)#求的是数组的秩
3、size(A)返回数组元素总数
4、random.randn(m,n)产生随机数组
5、tile(A,(m,n))用A来填充成m*n个A组成的数组,
a=np.reshape(np.arange(10),(2,5)) print a b=np.tile(a,(3,2)) print b [[0 1 2 3 4] [5 6 7 8 9]]
[[0 1 2 3 4 0 1 2 3 4] [5 6 7 8 9 5 6 7 8 9] [0 1 2 3 4 0 1 2 3 4] [5 6 7 8 9 5 6 7 8 9] [0 1 2 3 4 0 1 2 3 4] [5 6 7 8 9 5 6 7 8 9]]
6、ravel(A)将原始数组或矩阵返回成一维的数组形式,只是更改了视图,并没有复制数据
a=np.mat(np.ones((2,3))) c= np.ravel(a) b=np.ones((2,3)); d= np.ravel(b) print type(c) print type(d) print c.shape print d.shape <type 'numpy.ndarray'> <type 'numpy.ndarray'> (6L,) (6L,)
7、flatten和ravel类似的功能,只不过flatten是通过复制数组的,而且不会改变数组或矩阵类型
a=np.mat(np.ones((2,3))) c=np.ndarray.flatten(a) print a print c c=np.ravel(c) c[3]=20 print a print c [[ 1. 1. 1.] [ 1. 1. 1.]] [[ 1. 1. 1. 1. 1. 1.]] [[ 1. 1. 1.] [ 1. 1. 1.]] [ 1. 1. 1. 20. 1. 1.]
8、分割split, vsplit(A,t), hsplit。返回的是一个各个片段组成的列表
如果t是一个数,则均匀分成t份,如果t是一个矢量,则将分成几段
例如[2,5,8]则分成,[:2],[2:5],[5:8],[8:]
9、删除数据delete(x,[],axis)如果axis没有,则相当于在一个一位数组中删除后边列表里的数据,如果axis有数据,则在相应的坐标轴上删除行或列
axis=0表示在行上删除,axis=1表示在列上删除
>>> x = reshape(arange(20),(4,5)) >>> delete(x,1,0) # Same as x[[0,2,3]] array([[ 0, 1, 2, 3, 4], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]]) >>> delete(x,[2,3],1) # Same as x[:,[0,1,4]] array([[ 0, 1, 4], [ 5, 6, 9], [10, 11, 14], [15, 16, 19]]) >>> delete(x,[2,3]) # Same as hstack((x.flat[:2],x.flat[4:])) array([ 0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
10、squeeze 移除没有数据的多余维
>>> x = ones((5,1,5,1))
>>> shape(x)
(5L, 1L, 5L, 1L)
>>> y = x.squeeze()
>>> shape(y)
(5L, 5L)
>>> y = squeeze(x)
11、fliplr, flipud数组翻转
>>> x = reshape(arange(4),(2,2)) >>> x array([[0, 1], [2, 3]]) >>> fliplr(x) array([[1, 0], [3, 2]]) >>> flipud(x) array([[2, 3], [0, 1]])
12、diag会根据输入的不同而不同,
>>> x = reshape(arange(4),(2,2)) >>> x array([[0, 1], [2, 3]]) >>> fliplr(x) array([[1, 0], [3, 2]]) >>> flipud(x) array([[2, 3], [0, 1]])
13、cumsum在指定坐标轴上计算累积和
a=np.arange(1,11) print a np.cumsum(a) [ 1 2 3 4 5 6 7 8 9 10] Out[24]: array([ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55])
三、线性代数运算
1、solve(A,y),解线性方程组Ax=y,A是可逆的,则x=inv(A)y
>>> X = array([[1.0,2.0,3.0],[3.0,3.0,4.0],[1.0,1.0,4.0]]) >>> y = array([[1.0],[2.0],[3.0]]) >>> solve(X,y) array([[ 0.625], [-1.125], [ 0.875]])
2、最小二乘法lstsq(X,y),解线性方程组Ax= y ,A是n*k矩阵,n>k,
第一个是x,第二个是残差,第三个是the rank of X ,第四个是contains the singular values of X
>>> X = randn(100,2) >>> y = randn(100) >>> lstsq(X,y) (array([ 0.03414346, 0.02881763]), array([ 3.59331858]), 2, array([ 3.045516 , 1.99327863]))array([[ 0.625], [-1.125], [ 0.875]])
3、计算数组行列式
np.linalg.det(A)
4/、特征值m,n=np.linalg.eig(A),m是特征值,n是特征向量,作为元组返回
>>> x = matrix([[1,.5],[.5,1]]) >>> val,vec = eig(x) >>> vec*diag(val)*vec.T matrix([[ 1. , 0.5], [ 0.5, 1. ]])
5、矩阵的逆np.linalg.inv(A),在python中计算可能没有那么的精确,所以如果仅是判断是不是逆矩阵,可以使用np.allclose方法
a=np.array([[1,2],[3,4]]) b=np.linalg.inv(a); c=np.dot(a,b) print c print np.allclose(c,np.eye(2))
[[ 1.00000000e+00 1.11022302e-16] [ 0.00000000e+00 1.00000000e+00]] True
6、计算张量积z = np.kron(x,y)
7、迹np.trace(A)
8/matrix_rank computes the rank of an array using a SVD.
x = np.array([[1,.5],[1,.5]]) np.linalg.matrix_rank(x) Out[2]: 1
如果觉得有用,想赞助一下请移步赞助页面:赞助一下