numpy基础1

本文介绍了如何在PyCharm中利用批量注释功能,以及通过Numpy进行数组创建、数据类型转换、小数处理、形状操作、数组运算、数据读取、二维转置、数值修改、nan与inf处理、随机数生成等技术。涵盖了numpy的基础和实用技巧。
摘要由CSDN通过智能技术生成

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值