目录
1.8 生成随机数:random.rand(),random.randn(),random.randint()
7.1 数组形状,shape和reshape,reshape不会修改原有的数组,而会返回一个新的数组
Numpy 是Python 的⼀种开源的数值计算拓展,这种⼯具可⽤来存储和处理⼤型矩阵。
Numpy的⼀个重要特性是数组计算。
导入numpy包的几种方法:
import numpy
import numpy as np #导入numpy包并重命名为np
import numpy import * #导入numpy的所有函数,但若是大工程函数可能相同,会报错
一、创建数组
1.1 从列表传入:array()
import numpy as np
# list = [1,2,3,4]
# a = np.ayyay(list)
a = np.array([1,2,3,4])
b = np.array([5,6,7,8])
print(a)
print(a+1) # a里的所有元素+1
print(a*2) # a里的所有元素*2
print(a+b) # a里的元素和b里的元素一一对应相加
[1 2 3 4] [2 3 4 5] [2 4 6 8] [ 6 8 10 12]
1.2 生成全0数组:zeros()
a = np.zeros(5) # 生成5个元素为0的数组(默认为浮点型)
1.3 生成全1数组:ones()
a = np.ones(5) # 生成5个元素为1的数组
a = np.ones(5,dtype = 'bool') #类型改为布尔类型
a = np.ones(5,dtype = 'int')
1.4 fill(x)函数将数组设定为x:
a = np.ones(5) # 生成5个元素为1的数组
a.fill(5)
print(a)
1.5 类型转换:astype()
a=np.ones(5,dtype = 'int')
print(a)
a=a.astype('float') # 若不进行类型转换,当填充的值为小数时,最终结果会默认为整数(舍去小数)
print(a)
a.fill(2.5)
print(a)
1.6 生成整数序列:arange()
a = np.arange(1,10) # 左闭右开
print(a) # [1 2 3 4 5 6 7 8 9]
a = np.arange(1,10,2)
print(a) # [1, 3, 5, 7, 9]
1.7 生成等差数列:linspace()
# 生成范围为1-12,数量为12的等差数列
a = np.linspace(1,12,20)
print(a)
'''
[ 1. 1.57894737 2.15789474 2.73684211 3.31578947 3.89473684
4.47368421 5.05263158 5.63157895 6.21052632 6.78947368 7.36842105
7.94736842 8.52631579 9.10526316 9.68421053 10.26315789 10.84210526
11.42105263 12. ]
'''
1.8 生成随机数:random.rand(),random.randn(),random.randint()
#生成10个0-1(不包括1)的随机数
a = np.random.rand(10)
print(a)
#生成10个服从标准正态分布的随机数
a = np.random.randn(10)
print(a)
#生成10个范围在1-100间的随机数
a = np.random.randint(1,100,10)
print(a)
1.9 查看变量类型:type()
np.random.randint(1,100,10) #生成随机整数
print( type(a) ) # numpy.ndarray
1.10 查看数据的类型:dtype()
a = np.random.randint(1,100,10) #生成随机整数
print(a.dtype) # dtype('int32')
1.11 查看变量的形状:shape,size,ndim
a = np.random.randint(1,100,10) #生成随机整数
print(a)
print(a.shape) # (10,) 查看形状 行*列,该数据只有行没有列
print(a.size) # 10 查看元素的数目
print(a.ndim) # 1 查看维度
二、索引和切片
2.1 常规索引
a=np.array([0,1,2,3])
print(a[0]) # 0
a[0]=10 #修改第一个元素的值
print(a) # [10,1,2,3]
a=np.array([11,12,13,14,15])
a[1:3] #取索引号1-2的数,左闭右开 [12,13]
a[1:-2] #负索引,正数第一个到倒数第二个 [12,13]
a[-4:3] #倒数第四个到正数第三个 [12,13]
2.2 省略参数
print(a[-2:]) #倒数第二个到最后 [14,15]
print(a[::2]) #间隔为2,取所有 [11,13,15]
2.3 案例:计算一部电影的累计票房
ob=np.array([21000,21800,22100,23450])
#计算每一天的票房
ob2=ob[1:]-ob[:-1]
print(ob2) # [ 800, 300, 1350]
三、多维数组及其属性
3.1 查看数组属性
a=np.array([[0,1,2,3],[10,11,12,13]])
print(a)
a.shape #查看形状 (2,4)
a.size #查看数量 8
a.ndim #查看维度 2
3.2 多维数组索引:
a=np.array([[0,1,2,3],[10,11,12,13]])
print(a[1,3]) #a[行,列],第二行第四列 注意:索引是从0开始的
a[0,1]=15 #更改
print(a)
print(a[0]) #索引第一行
print(a[:,3]) #索引列,注意前面有冒号,所有行第四列
13 [[ 0 15 2 3] [10 11 12 13]] [ 0 15 2 3] [ 3 13]
3.3 多维数组切片:
a=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45]])
print(a)
print(a[0,3:5]) # 取第一行第四个和第五个元素,即[0,4][0,5]元素
print(a[-2:,-2:]) # 最后两行的最后两列
print(a[:,2]) # 得到第三列
print(a[2::2,::2])# 取第三行到最后一行,间隔一行的行数,所有列中间隔一列的列数
[[ 0 1 2 3 4 5] [10 11 12 13 14 15] [20 21 22 23 24 25] [30 31 32 33 34 35] [40 41 42 43 44 45]] [3 4] [[34 35] [44 45]] [ 2 12 22 32 42] [[20 22 24] [40 42 44]]
切片在numpy数组中是引用,当引用的变量的元素改变时,被引用的变量中的元素也会变
a=np.array([0,1,2,3,4])
b=a[0:2] # b = [0,1]
b[0]=10
print(a) # [10 1 2 3 4]
解决情况:copy()
a=np.array([0,1,2,3,4])
b=a[0:2].copy() # b = [0,1]
b[0]=10
print(a)
四、花式索引
4.1 一维花式索引
a=np.arange(0,100,10)
index=[1,2,-3]
y=a[index]
print(y) # [10 20 70]
布尔数组索引:
a=np.arange(0,100,10)
#mask必须是布尔数组,长度必须和数组长度相同
mask=np.array([0,2,2,3,0,1,2,0,1,1],dtype=bool)
#在mask定义的位置上为true的进行索引。索引位置:1,2,3,5,6,8,9
print(a[mask]) # [10, 20, 30, 50, 60, 80, 90])
4.2 二维花式索引
a=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],
[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
print(a)
# 返回第一列第一行,第二列第二行,第三列第三行,第四列第四行,第五列第五行的元素
print(a[(0,1,2,3,4),(0,1,2,3,4)])
# 返回第四行到最后一行,奇数列的元素
print(a[3:,::2])
[[ 0 1 2 3 4 5] [10 11 12 13 14 15] [20 21 22 23 24 25] [30 31 32 33 34 35] [40 41 42 43 44 45] [50 51 52 53 54 55]] [ 0 11 22 33 44] [[30 32 34] [40 42 44] [50 52 54]]
a=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],
[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
print(a)
mask=np.array([1,0,1,0,0,1],dtype=bool)
print(a[mask,2]) #第一行,第三行,最后一行,第三列的元素 [ 2, 22, 52]
4.3 不完全索引
a=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],
[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
print(a)
y=a[:3] # 前三行所有列的元素
[[ 0 1 2 3 4 5] [10 11 12 13 14 15] [20 21 22 23 24 25]]
a=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],
[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
print(a)
con=np.array([0,1,1,0,1,0],dtype=bool)
print(a[con]) # #取2,3,5,行,所有列的元素
[[10 11 12 13 14 15] [20 21 22 23 24 25] [40 41 42 43 44 45]]
4.4 where语句
where函数会返回所有非零元素的索引
a=np.array([0,12,5,20])
print(a>10) # 返回元素里大于10的布尔值
print(np.where(a>10)) # 返回>10的元素的索引的元组
print(a[a>10]) # 返回>10的元素
print(a[np.where(a>10)]) # a[a里>10的索引]
[False True False True] (array([1, 3], dtype=int64),) [12 20] [12 20]
五、数组类型
#类型转换
a=np.array([1,5,-3],dtype=float)
print(a)
#asarray函数 (个人认为不如用上面那个)
a=np.array([1,2,3])
b = np.asarray(a,dtype=float)
print(a)
print(b)
#astype
a=np.array([4,5,6])
b = a.astype(float)
print(a)
print(b)
[ 1. 5. -3.] [1 2 3] [1. 2. 3.] [4 5 6] [4. 5. 6.]
六、数组操作(以豆瓣10部高分电影为例)
mv_name=['肖申克的救赎','控方证人','美丽人生','阿甘正传','霸王别姬','泰坦尼克号','辛德勒的名单','这个杀手不太冷','疯狂动物城','海豚湾']
#电影名称
mv_num=np.array([692795,42995,327855,580897,478523,157074,306904,662552,284652,159302])#评分人数
mv_score=np.array([9.6,9.5,9.5,9.4,9.4,9.4,9.4,9.3,9.3,9.3])#评分
mv_length=np.array([142,116,116,142,171,194,195,133,109,92])#电影时长(分钟)
6.1 数组排序:
#sort函数
print(np.sort(mv_num)) #未改变原有数组
print(mv_num)
#argsort函数,返回从小到大的排列数组中的索引位置
order=np.argsort(mv_num)
print(order)
print(mv_name[order[0]]) #找到观影人数最少的电影的名字
print(mv_name[order[-1]]) #找到观影人数最多的电影的名字
[ 42995 157074 159302 284652 306904 327855 478523 580897 662552 692795] [692795 42995 327855 580897 478523 157074 306904 662552 284652 159302] [1 5 9 8 6 2 4 3 7 0] 控方证人 肖申克的救赎
6.2 其他常见函数:
#评分人数求和
print(np.sum(mv_num)) #两个函数都行,下面是一样的
mv_num.sum()
#时长最长
print(np.max(mv_length))
mv_length.max()
#时长最短
print(np.min(mv_length))
mv_length.min()
#得分平均值
print(np.mean(mv_score))
mv_score.mean()
#得分标准差
print(np.std(mv_score))
mv_score.std()
#得分和时长的协方差矩阵
print(np.cov(mv_score,mv_length))
#得分和时长的相关系数
print(np.corrcoef(mv_score,mv_length))
3693549 195 92 9.41 0.09433981132056571 [[9.88888889e-03 4.55555556e-01] [4.55555556e-01 1.26288889e+03]] [[1. 0.12890953] [0.12890953 1. ]]
七、多维数组操作
7.1 数组形状,shape和reshape,reshape不会修改原有的数组,而会返回一个新的数组
a=np.arange(6)
print(a)
a.shape=2,3 #转为2维3列
print(a.shape) #查看a的形状
print(a) #可以看出原来的数组已经被修改了
[0 1 2 3 4 5] (2, 3) [[0 1 2] [3 4 5]]
a=np.arange(6)
print(a)
a.reshape(2,3) #转为2维3列
print(a.shape) #查看a的形状
print(a) #可以看出还是原来的数组
[0 1 2 3 4 5] (6,) [0 1 2 3 4 5]
注意:shape和reshape的格式不一样
7.2 转置
a=np.arange(6)
a=a.reshape(2,3)
print(a)
print(a.T )
print(a.transpose())
[[0 1 2] [3 4 5]] [[0 3] [1 4] [2 5]] [[0 3] [1 4] [2 5]]
7.3 数组连接
第一种方法:
x=np.array([[0,1,2],[10,11,12]])
y=np.array([[90,91,92],[100,101,102]])
print(x)
print(y)
z=np.concatenate((x,y),axis=0) #按照列
print(z)
m=np.concatenate((x,y),axis=1) #按照行
print(m)
n=np.array((x,y))#生成三维数组
print(n)
[[ 0 1 2] [10 11 12]] [[ 90 91 92] [100 101 102]] [[ 0 1 2] [ 10 11 12] [ 90 91 92] [100 101 102]] [[ 0 1 2 90 91 92] [ 10 11 12 100 101 102]] [[[ 0 1 2] [ 10 11 12]] [[ 90 91 92] [100 101 102]]]
第二种方法:
x=np.array([[0,1,2],[10,11,12]])
y=np.array([[90,91,92],[100,101,102]])
print(x)
print(y)
#vstack(按照行)
print( np.vstack((x,y)) )
#hstack(按照列)
print( np.hstack((x,y)) )
#dstack(生成三维数组)
print( np.dstack((x,y)) )
7.4 numpy内置函数(部分函数)
a=np.array([-1,0,-10,5,7])
print( np.abs(a) ) #计算绝对值
print( np.median(a) ) #计算中位数
print( np.exp(a) ) #求指数
print( np.cumsum(a) ) #累计和
[ 1 0 10 5 7] 0.0 [3.67879441e-01 1.00000000e+00 4.53999298e-05 1.48413159e+02 1.09663316e+03] [ -1 -1 -11 -6 1]