1,pycharm中批量注释功能:ctrl+/
2,numpy数组的创建
#创建数组的三种方法 a=np.array([1,2,3]) print(a) print(type(a)) b=np.array(range(10)) print(b) c=np.arange(10)#=np.array(range(10)) print(c)
结果为
[1 2 3][0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9]
3,指定数据类型
a=np.arange(4,10,2,dtype=float)
print(a)
print(a.dtype)#a中数据的类型
a=np.array(range(10),dtype='int8')#注意如果不加''就只能写int,float之类的不能写int8(i1)
print(a)
print(a.dtype)#a中数据的类型
#调整数据类型
b=a.astype('int32')
print(b)
print(b.dtype)
结果为:
[4. 6. 8.] float64 [0 1 2 3 4 5 6 7 8 9] int8 [0 1 2 3 4 5 6 7 8 9] int32
4,numpy中的小数
a=np.array([random.random() for i in range(10)])#random.random()取出0-1中间的一个随机小数 print(a.dtype) print(a) b=np.round(a,2)#np.round 实现取小数位数 print(b) print(b.dtype)
结果为:
float64 [0.43862789 0.17282301 0.62031606 0.81452307 0.01375042 0.15249559 0.7118712 0.80971245 0.90993671 0.98013062] [0.44 0.17 0.62 0.81 0.01 0.15 0.71 0.81 0.91 0.98] float64
5,numpy数据的形状与改变形状
#numpy数据的形状与改变形状
a=np.arange(24)
print(a.shape)
b=a.reshape(2,3,4)#2可以理解为多少块数据,3可理解为多少行,4可理解为多少列
print(b)
c=np.array([[[1,2,3],
[4,5,6]],
[[7,8,9],
[1,2,3]]])
print(c)
print(c.shape)
# 结果如下:
# (24,)
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
#
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
# [[[1 2 3]
# [4 5 6]]
#
# [[7 8 9]
# [1 2 3]]]
# (2, 2, 3)
d=c.reshape((2,6))
print(d)
e=a.reshape((2,2,2,3))#四维数据
print(e)
# 结果为
# [[1 2 3 4 5 6]
# [7 8 9 1 2 3]]
# [[[[ 0 1 2]
# [ 3 4 5]]
#
# [[ 6 7 8]
# [ 9 10 11]]]
#
#
# [[[12 13 14]
# [15 16 17]]
#
# [[18 19 20]
# [21 22 23]]]]
#
6,改变形状为一维数组
#t5=t5.reshape((2,3))#如果结果为改变后的值,说明这个方法不是原地操作,即在原列表中操作,如果结果为none,说明该方法为原地操作 a=np.arange(24).reshape((2,3,4)) b=a.reshape((24,))#变为一维数组,而不是(24,1)或者(1,24),简单理解为,几维数组元组中就有几个数 print(b) #如果不知道一个数组中一共有几个元素,但需要将该数组变为一维数组 #第一种方法: c=a.reshape((a.shape[0]*a.shape[1]*a.shape[2],)) print(c) #第二种方法: d=a.flatten()#展开 print(d)
结果为:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
7,数组运算
#数组的计算 #广播机制 a=np.arange(12).reshape((3,4)) print(a+2) print(a/0)#结果中nan表示不是一个数字,inf表示无穷的意思
结果如下:
[[ 2 3 4 5] [ 6 7 8 9] [10 11 12 13]] [[nan inf inf inf] [inf inf inf inf] [inf inf inf inf]]
8,数组与数组运算
#数组与数组运算(形状相同) a=np.arange(12).reshape((3,4)) print(a) b=np.arange(30,42).reshape((3,4)) print(a*b) #形状不同但有一个维度相同,采用广播兼容原则 c=np.array([1,2,3,4]) print(a+c)#每一行都加[1,2,3,4] d=np.array([1,2,3]).reshape(3,1) e=a.reshape(2,3,2) print(a+d)#每一列都加[1,2,3] print(e) print(e+d)#找到相同维度就可以计算 f=np.arange(18).reshape((3,3,2)) g=np.arange(9).reshape((3,3)) print(f+g)#不能计算
结果为
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[ 0 31 64 99] [136 175 216 259] [304 351 400 451]] [[ 1 3 5 7] [ 5 7 9 11] [ 9 11 13 15]] [[ 1 2 3 4] [ 6 7 8 9] [11 12 13 14]] [[[ 0 1] [ 2 3] [ 4 5]] [[ 6 7] [ 8 9] [10 11]]] [[[ 1 2] [ 4 5] [ 7 8]] [[ 7 8] [10 11] [13 14]]]
9,numpy读取数据
#numpy中的轴,二维中0轴:表示行方向,有几行,1表示列方向,有几列,如(2,5)0轴为2,1轴为5,即在元组中的第几个数 #(2,2,3)0轴为2,1轴为2,为行方向,2轴为3,为列方向 #numpy读取数据,一般用pandas读取本地数据,不用numpy us_file_path='./youtube_video_data/US_video_data_numbers.csv' gb_file_path='./youtube_video_data/GB_video_data_numbers.csv' t1=np.loadtxt(us_file_path,delimiter=',',dtype='int',unpack=False) #np.loadtxt的第一个参数为路径,delimiter表示文件中以什么为分割符,csv文件为, ,dtype可以让数据存储不使用科学计数法 #unpack=False,默认为false,如果为true,则会将读取出来的数据转置,即变为四行n列数据 #skiprows参数表示跳过开头几行,usecols表示用哪几列,usecols=[1,2,3] print(t1) print(type(t1)) #取行 print(t1[2])#取第三行 #取连续多行 print(t1[2:4]) #取不连续多行 print(t1[[2,8,10]])#3,9,11行,注意多个索引值要用列表括起来,如[2,8,10] #取列 print(t1[:,0])#取所有行的第一列 print(t1[0:2,0])#取第一行到第二行的第一列 print(t1[[2,10,8],:])#取3,9,11行的所有列 #取连续多列 print(t1[:,2:])#取第三列后所有列 #取不连续多列 print(t1[:,[0,2]])#取第一列和第三列 #取行列,取第3行,第四列的值 a=t1[2,3] print(a) print(type(a))#这里类型是int32,而不是特殊的numpy.ndarray类型 #取多行和多列,取第3行到第五行,第2列到第4列的结果 b=t1[2:5,1:4] print(b) print(type(b))#类型为numpy.ndarray #取多个不相邻的点,即取不连续的多行多列 #此处应该注意,并不是取第几行的第几列,而取出来的是点 #选出来的结果是(0,0) (2,1) (2,3) c = t1[[0,2,2],[0,1,3]] print(c)
10,二维数据的转置
#二维数据的转置 a=np.arange(24).reshape(4,6) print(a) print(a.transpose())#第一种方法 print(a.T)#第二种方法 print(a.swapaxes(1,0))#第三种方法,将1轴和0轴交换,写成0,1也可以
11,numpy中数值的修改
a=np.arange(24).reshape(4,6) print(a) a[:,2:4]=0#将3列和四列都置为0 print(a) #将a中<10的数替换成3 print(a<10) a[a<10]=3#称为numpy中的布尔索引,赋值列表中为True的地方 print(a) #如果想要将小于10的数字替换成1,大于10的数字替换成20 b=np.where(a<10,1,20) #以a<10为条件,符合条件的置为1,其他的置为20 print(b) #如果想要将小于10的数字替换成10,大于20的数字替换成20 a=a.astype(float) a[3,3]=np.nan#将其中一个数值赋值为nan,但是nan为浮点类型,a为整形数组,所以需要转化 a[3,4]=np.inf print(a) c=a.clip(10,20)#裁剪,但是不会对nan起作用,对inf起作用 print(c)
结果如下:
[[ 0 1 2 3 4 5] [ 6 7 8 9 10 11] [12 13 14 15 16 17] [18 19 20 21 22 23]] [[ 0 1 0 0 4 5] [ 6 7 0 0 10 11] [12 13 0 0 16 17] [18 19 0 0 22 23]] [[ True True True True True True] [ True True True True False False] [False False True True False False] [False False True True False False]] [[ 3 3 3 3 3 3] [ 3 3 3 3 10 11] [12 13 3 3 16 17] [18 19 3 3 22 23]] [[ 1 1 1 1 1 1] [ 1 1 1 1 20 20] [20 20 1 1 20 20] [20 20 1 1 20 20]] [[ 3. 3. 3. 3. 3. 3.] [ 3. 3. 3. 3. 10. 11.] [12. 13. 3. 3. 16. 17.] [18. 19. 3. nan inf 23.]] [[10. 10. 10. 10. 10. 10.] [10. 10. 10. 10. 10. 11.] [12. 13. 10. 10. 16. 17.] [18. 19. 10. nan 20. 20.]] Process finished with exit code 0
12,nan与inf,常用统计函数
print(np.nan==np.nan) print(np.nan!=np.nan) a=np.arange(24).reshape(4,6) a=a.astype(float) a[3,3]=np.nan print(a) print(np.count_nonzero(a))#a中不为0的个数,结果为23 print(np.count_nonzero(a!=a))#这一操作可以用来检测a中nan的个数 #因为np.count_nonzero(a)统计的是a中不为0的个数,a!=a返回的布尔表中,只有nan的位置为True为非0 print(np.isnan(a))#返回为布尔表 print(np.count_nonzero(np.isnan(a))) a[np.isnan(a)]=0 print(a)#没有nan了 #nan与任何值计算都为nan a[3,3]=np.nan print(np.sum(a))#结果为nan b=np.arange(12).reshape(3,4) print(np.sum(b,axis=0))#对应列相加,可以理解为在0轴方向(行方向)进行计算,与行形状相同,结果压缩为一行 print(np.sum(b,axis=1))#对应行相加,结果压缩为一列 #将nan值替换成0是不合适的,因为在进行计算时(如:平均值),会使得结果不准确,nan应该替换为平均值,或者中值(奇数为中间的数,偶数为中间两个数取平均值) #求平均值 print(np.mean(a,axis=0))#每列求均值 print(np.median(a,axis=0))#每列求中值 print(np.max(a,axis=0)) print(np.min(a,axis=0)) print(np.ptp(a,axis=0))#求每列极值,最大值-最小值 print(np.std(a,axis=0))#求每列标准差
13,实现nan类型的替换
#实现替换nan的操作
def fill_nan(t):
for i in range(t.shape[1]):#表示在列方向
temp_col=t[:,i]#取出当前列
non_num=np.count_nonzero(temp_col!=temp_col)
if non_num!=0:
temp_col_num=temp_col[temp_col==temp_col]
print(temp_col_num)
temp_col_nan=temp_col[temp_col!=temp_col]
print(temp_col_nan)
temp_col[np.isnan(temp_col)]=temp_col_num.mean()
#temp_col_nan=temp_col_num.mean()
#如果写成temp_col_nan=temp_col_num.mean()则不能实现功能
#因为temp_col_nan=temp_col[temp_col!=temp_col]这句话相当于给temp_col_nan赋值了一个nan,而并不能表示temp_col的对应位置
#temp_col[temp_col!=temp_col]=1表示给true的地方赋值,而temp_col_nan中只是一个nan值
return t #返回t应该在循环外面
14,总结
15,练习
#绘制评论直方图 import numpy as np from matplotlib import pyplot as plt us_file_path = "./youtube_video_data/US_video_data_numbers.csv" uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv" t_us=np.loadtxt(us_file_path,delimiter=',',dtype='int',usecols=[-1])#选择最后一列 #选择比5000小的数据,因为在本例中很大的数据只有很少 t_us=t_us[t_us<5000] print(t_us.max(),t_us.min()) #组距 d=250 bin_nums=(t_us.max()-t_us.min())//d #画图 plt.hist(t_us,bin_nums) plt.grid() plt.show() #绘制评论与喜欢关系图,因为是关系所以使用散点图 import numpy as np from matplotlib import pyplot as plt us_file_path = "./youtube_video_data/US_video_data_numbers.csv" uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv" t_us=np.loadtxt(us_file_path,delimiter=',',dtype='int') #发现喜欢数在100000范围中比较集中,所以需要截取数据,截取数据也不可以只截取喜欢数,而应该把取出来的数据都截掉 t_us=t_us[t_us[:,1]<100000] t_us_comment=t_us[:,-1] t_us_like=t_us[:,1] plt.scatter(t_us_like,t_us_comment) plt.show()
16,数据拼接
#数据拼接 t1=np.arange(12).reshape(3,4) t2=np.arange(12,24).reshape(3,4) print(np.vstack((t1,t2)))#竖直拼接 print(np.hstack((t1,t2)))#水平拼接 #与之对应的数值分割方法,v表示竖直方向,按行方向分割,h表示水平切割,但是按列方向分割 #交换数据的某两行或某两列,有的时候拼接起来的数据不对应 print(t1) t1[[1,2],:]=t1[[2,1],:]#交换2,3两行 print(t1) t1[:,[2,3]]=t1[:,[3,2]]#交换3,4两列 print(t1)
17,
import numpy as np us_data = "./youtube_video_data/US_video_data_numbers.csv" uk_data = "./youtube_video_data/GB_video_data_numbers.csv" #加载国家数据 us_data = np.loadtxt(us_data,delimiter=",",dtype=int) uk_data = np.loadtxt(uk_data,delimiter=",",dtype=int) # 添加国家信息 #构造全为0的数据 zeros_data = np.zeros((us_data.shape[0],1)).astype(int)#注意shape用[] ones_data = np.ones((uk_data.shape[0],1)).astype(int) #分别添加一列全为0,1的数组 us_data = np.hstack((us_data,zeros_data)) uk_data = np.hstack((uk_data,ones_data)) # 拼接两组数据 final_data = np.vstack((us_data,uk_data)) print(final_data)
18,numpy中的随机数产生
#创建一个对角线为1的正方形方阵 print(np.eye(3)) print(np.ones((3,4))) print(np.zeros((3,4))) #获得最大值最小值的位置 a=np.arange(12) print(np.argmax(a,axis=0)) print(np.argmin(a,axis=0)) ''' ''' print(np.random.rand(2,3))#创建一个0-1的均匀分布的对应数组 print(np.random.randn(2,3))#创建一个0-1的正态分布的对应数组 print(np.random.randint(0,5,(2,3)))#在0-5中间两行三列的随机整数 print(np.random.uniform(0,5,(2,3)))#在0-5中间两行三列的随机数,可以为整数也可以为小数 print(np.random.normal(0,1,(2,3)))#指定中心和标准差的正态分布 np.random.seed(2)#作用是使每次随机出的数字相同,参数的作用是指定随机数的起始位置,可以随意指定 t=np.random.randint(0,5,(2,3)) print(t) t1=np.random.randint(0,5,(2,3)) print(t1) t2=np.random.randint(0,5,(2,3)) print(t2) t3=np.random.randint(0,5,(2,3)) print(t3)



