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]
<class 'numpy.ndarray'>
[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)