np.zeros(10)
Out[14]:array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros((3,5),dtype=int) #np.zeros(shape=(3,5),dtype=int)
Out[15]: array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])
arange方法和python2中的arange方法类似,默认值是0-n-1,但是它支持步长为小数。
np.arange(10)
Out[16]:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(0,20,2)
Out[17]:array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
np.arange(0,1,0.2)
Out[18]:array([ 0. , 0.2, 0.4, 0.6, 0.8])
np.linspace(0,20,10) #0到20之间等间距地分成10份,包含0和20两个点
np.linspace(0,20,10)
Out[20]:
array([ 0. , 2.22222222, 4.44444444, 6.66666667,
8.88888889, 11.11111111, 13.33333333, 15.55555556,
17.77777778, 20. ])
numpy.random
random() [0,1)之间的随机浮点数
np.random.seed(666)
np.random.randint(0,10,10) #创建10个[0,10)之间的整数(注意前闭后开)
Out[21]:array([3, 6, 8, 6, 2, 7, 9, 2, 3, 9])
np.random.randint(4,8,size=(3,5))
Out[22]:
array([[4, 5, 5, 5, 4],
[4, 7, 4, 6, 4],
[7, 6, 5, 7, 4]])
np.random.random(10) #10是指size
Out[23]:
array([ 0.50242227, 0.17298419, 0.26348954, 0.600199 , 0.6691488 ,
0.39283773, 0.37043944, 0.30396405, 0.99071216, 0.65455463])
默认符合均值为0,方差为1的随机浮点数
np.random.normal(10,100,size=(3,5))
Out[26]:
array([[ -24.5258828 , -23.72306007, 6.88579462, -23.29286657, -33.32319528],
[ -39.33190778, 2.43981867, -30.17166951, 6.22937488, 3.79212453],
[ 22.72826743, -156.27817465, 8.43966765, -46.36703314, 33.91110828]])
查看相关文档:
np.random.normal?可以调出normal相关文档(会开一个新页面)。
np.random?调出random模块相关文档(会开一个新页面)。
help(np.random.normal)
numpy.array的基本操作
numpy.array的数据访问
1.索引访问
2.切片访问
X=np.arange(15).reshape(3,5)
X
Out[27]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
X[2,2]
Out[28]:12
X[:2,:3]
Out[29]:
array([[0, 1, 2],
[5, 6, 7]])
X[:,:3] #选取某个维度用单个:
Out[30]:
array([[ 0, 1, 2],
[ 5, 6, 7],
[10, 11, 12]])
subX=X[:2,:3]
subX获得的是对原X的引用,对subX的操作会作用到原X中,同步变化(浅拷贝)
subX2=X[:2,:3].copy()
subX获得的是对原X的副本,对subX的操作不会作用到原X中(深拷贝)
numpy.array的数组变换
x=np.arange(10)
x
Out[31]:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x.reshape(2,5)
Out[32]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
x.reshape(5,-1) #只关心第一维度5行,第二维度自动计算(能自动整除,否则报错),可赋值为-1
Out[33]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
矩阵的合并与分割
x=np.array([1,2,3])
y=np.array([3,2,1])
z=np.array([6,6])
np.concatenate([x,y,z])
Out[34]:
array([1, 2, 3, 3, 2, 1, 6, 6])
A=np.array([[1,2,3],
[3,4,5]])
np.concatenate([A,A])
Out[35]:
array([[1, 2, 3],
[3, 4, 5],
[1, 2, 3],
[3, 4, 5]])
np.concatenate([A,A],axis=1) #axis表示维度,默认为0
Out[36]:
array([[1, 2, 3, 1, 2, 3],
[3, 4, 5, 3, 4, 5]])
np.concatenate([A,x.reshape(1,-1)]) #concatenate只能处理维数一致的情况,不一致的话要转换
Out[37]:
array([[1, 2, 3],
[3, 4, 5],
[1, 2, 3]])
或者采用vstack(竖直方向堆叠)
np.vstack([A,x])
Out[38]:
array([[1, 2, 3],
[3, 4, 5],
[1, 2, 3]])
hstack(水平方向堆叠)
B=np.array([[1,1],
[1,1]])
np.hstack([A,B])
Out[40]:
array([[1, 2, 3, 1, 1],
[3, 4, 5, 1, 1]])
np.split()
x=np.arange(10)
np.split(x,[3,7]) #以3或7为间隔分割
Out[41]:[array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])]
np.split(x,5) #第二个参数为整数表示用该数平均切分,不能整除会报错
Out[42]:[array([0, 1]), array([2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]
A=np.arange(16).reshape([4,4])
np.split(A,[2]) #默认是按行的维度
Out[45]:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]),
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
np.split(A,[2],axis=1)
Out[46]:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]),
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
np.vsplit(A,[2]) #上下分割
Out[47]:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]),
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
np.hsplit(A,[2])
Out[48]: #左右分割
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]),
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
分割可以应用于分离数据的特征和标签
x,y=np.hsplit(A,[-1])
y[:,0]
Out[50]:array([ 3, 7, 11, 15])
numpy.array中的运算
一元函数:
+,-,*,/,//,**,%作用于数组的每一个元素
np.power(3,x)==3**x 计算数组各元素的3的指数次方
二元函数(矩阵之间的运算要保证是可以运算的)
A*B是指对应元素相乘
A.dot(B)是数学意义上的矩阵乘法运算
A.T是矩阵A的转置
向量和矩阵的运算
一个向量和一个矩阵做加法,这个向量和这个矩阵中的每一行做加法
A=np.arange(1,5).reshape([2,2])
v=np.array([1,2])
v+A
Out[54]:
array([[2, 4],
[4, 6]])
np.vstack([v]*A.shape[0]) #水平方向堆叠
Out[56]:
array([[1, 2],
[1, 2]])
np.tile(v,(2,1)) #元组(2,1)表示行向量堆叠2次,列向量堆叠1次
Out[57]:
array([[1, 2],
[1, 2]])
v.dot(A)
Out[59]:array([ 7, 10])
A.dot(v) #v被看成2*1的矩阵
Out[60]:array([ 5, 11])
矩阵的逆
A 为方阵时:
A的逆=np.linalg.inv(A)
A*A的逆=单位矩阵
A=np.arange(4).reshape(2,2)
np.linalg.inv(A)
Out[61]:
array([[-1.5, 0.5],
[ 1. , 0. ]])
A.dot(np.linalg.inv(A))
Out[67]:
array([[ 1., 0.],
[ 0., 1.]])
A非方阵时,A的伪逆矩阵=np.linalg.pinv(A)
聚合运算
prod(a) 计算数组a中的元素之积
percentile(a,q) 数组中q%个元素小于等于的值(q=50时,该值等于中位数)
A=np.arange(16).reshape(4,-1)
A
Out[69]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
np.sum(A,axis=0) #把行压缩掉,就是对每列相加
Out[70]:array([24, 28, 32, 36])
np.sum(A,axis=1) #对每行相加
Out[71]:array([ 6, 22, 38, 54])
排序
sort()
A=np.random.randint(10,size=(4,4))
A
Out[73]:
array([[7, 7, 7, 0],
[6, 2, 9, 2],
[7, 5, 5, 0],
[0, 5, 1, 6]])
np.sort(A,axis=1) #默认axis=1,按行排序
Out[74]:
array([[0, 7, 7, 7],
[2, 2, 6, 9],
[0, 5, 5, 7],
[0, 1, 5, 6]])
np.sort(A,axis=0) #按列排序
Out[75]:
array([[0, 2, 1, 0],
[6, 5, 5, 0],
[7, 5, 7, 2],
[7, 7, 9, 6]])
x=np.arange(16)
np.random.shuffle(x)
x
Out[77]:array([10, 9, 13, 15, 4, 11, 14, 5, 0, 3, 2, 7, 6, 8, 12, 1])
np.argsort(x) #根据索引项排序后即为正序
Out[78]:array([ 8, 15, 10, 9, 4, 7, 12, 11, 13, 1, 0, 5, 14, 2, 6, 3], dtype=int64)
np.partition(x,4) #一次快排的结果,4前面的元素比4小,后面的元素比4大
Out[79]:array([ 1, 0, 2, 3, 4, 5, 14, 9, 11, 15, 13, 7, 6, 8, 12, 10])
numpy中的比较和FancyIndexing
numpy提供对索引数组的访问
x=np.arange(16)
ind=[3,5,8]
x[ind]
Out[80]:array([3, 5, 8])
ind=np.array([[0,2],
[1,3]])
x[ind]
Out[81]:
array([[0, 2],
[1, 3]])
A=x.reshape(4,-1)
row=np.array([0,1,2])
col=np.array([1,2,3]) #三个点坐标分别为(0,1)(1,2)(2,3)
A[row,col]
Out[83]:array([ 1, 6, 11])
A[:2,col]
Out[84]:
array([[1, 2, 3],
[5, 6, 7]])
对bool值进行FancyIndexing
比较运算符:<,>,<=,>=,==,!=
col=[True,False,True,True]
A[1:3,col]
Out[84]:
array([[4, 6, 7],
[8, 10, 11]])
A<4
Out[86]:
array([[ True, True, True, True],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False]], dtype=bool)
2*x==24-4*x
Out[87]:
array([False, False, False, False, True, False, False, False, False,
False, False, False, False, False, False, False], dtype=bool)
np.sum(x<=3) #实际应用eg年龄小于4的学生个数,等价于np.count_nonzero(x <= 3)
Out[89]:4
np.sum(x%2==0) #偶数个数(通过axis可以指定列数)
np.sum((x>3) & (x<10)) #注意中间只用位运算符
np.any(x==0) #是否存在为0的数字,返回True
np.all(x>0) #是否所有的数都大于0,返回False
np.sum(~(x==0)) #等价于np.sum(x!=0)
x[x<5] #小于5岁的学生的具体年龄
Out[94]:array([0, 1, 2, 3, 4])
A[A[:,3]%3==0,:] #抽取出满足最后一个数3整除的行
Out[95]:
array([[ 0, 1, 2, 3],
[12, 13, 14, 15]])