目录
什么是numpy
一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型多维数组上执行数值运算。
数组的创建
import numpy as np
import random
t1 = np.array([1,2,3,4])
print(t1,type(t1))
#t2和t3是两种不同的表示方式,可以定义一样的数据
t2 = np.arange(10)
print(t2,type(t2))
t3 = np.array(range(10))
print(t3,type(t3))
t4 = np.arange(4,10,2)
print(t4,type(t4),t4.dtype)
t5= np.array(range(5),dtype=float)
print(t5,type(t5),t5.dtype)
t6= np.array(range(5),dtype="i1")#i1表示int8如果内存不够大 可以定义变量的dtype
print(t6,type(t6),t6.dtype)
#numpy中的布尔类型
t7 = np.array([1,0,0,1,1],dtype=bool)
print(t7,t7.dtype)
#调整数据类型.astype
t8 = t7.astype("int8")
print(t8,t8.dtype)
#numpy中的小数
t9 = np.array([random.random() for i in range(10)])
print(t9,t9.dtype)
#保留两位小数
t10 = [float("%.2f"%i) for i in t9]
print(t10)
数组的形状
#numpy可以表示多维数组对象
import numpy as np
t1 = np.array([[[1,2,3,4],[4,5,6,7]],[[1,2,3,4],[4,5,6,7]],[[1,2,3,4],[4,5,6,7]]])
print(t1)
print(t1.shape)#.shape表示数组的形状即(l,m,n)
#数组的shape属性中有几个数,该数组就是个几维数组
#reshape属性可以用来改变数组的形状,且数组的形状只能变成正好的(相乘结果固定),否则会有错误
#变为三维数组
t2 = t1.reshape(2,3,4)
print(t2)
#变为二维数组
t3 = t1.reshape(4,6)
print(t3)
#变为一维数组
t4 = t1.reshape(24)
print(t4)
#变为几维数组,reshape中就有几个数
#查看某个数组中的元素个数
print(t1.flatten().shape) #转换为一维数组.flatten()方法
数组的计算
#数组的计算 import numpy as np t1 = np.array([[0,2,3,4],[4,5,6,7],[1,2,3,3]]) print(t1.shape) #与数字计算(广播) print(t1+2) #print(t1/0)#inf表示无限、无穷的意思 #数组之间 #形状一样的数组,对应元素相加减 #2*3的数组±1*3的数组,每一行都±1*3的数组 #2*3的数组±2*1的数组,每一列都±2*1的数组 #不一样行不一样列的数组相加减会报错 #(3,3,2)可以和(3,2)进行计算,可以和(3,3)进行计算 t2 = np.array([1,1,1,1]) print(t1-t2) t3 = t1-t2 print(t1*t2)#乘法和加法的规则一样 #如果希望得到矩阵的乘法结果需要借助特定的函数计算
数组的转置
import numpy as np
#普通数组的转置方法
a = np.arange(24).reshape(4,6)
print(a)
#以下三种方法都是实现数组的转置
print(a.T)
print(a.transpose())
print(a.swapaxes(1,0))#交换轴
numpy读取本地数据
轴:一维数组有一个0轴,二维数组有0轴和1轴(0表示行,1表示列),三维数组有0轴、1轴和2轴(0轴表示的块,1轴表示行,2轴表示列)
计算一个2维数组的平均值,必须指定哪个方向上的数字的平均值
三维的轴
numpy读取.csv文件数据,(.csv文件采用逗号分割值)
读取文本文件数据
np.loadtxt(frame,dtype=mp.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
frame:文件路径
dtype:以什么数据格式将.csv文件中的数据读取到数组中,默认np.float
delimiter:分割字符串,默认是任何空格,CSV改为逗号
skiprows:跳过前x行,一般跳过第一行表头
usecols:读取指定的列,索引,元组类型
unpack:转置效果
索引和切片操作
#numpy读取本地数据
import numpy as np
us_file_path = './US_video_data_numbers.csv'
uk_file_path = './GB_video_data_numbers.csv'
#t1 = np.loadtxt(us_file_path,dtype='int',delimiter=",",unpack=True)
t2= np.loadtxt(us_file_path,dtype='int',delimiter=",")
print(t2)
print("*"*100)
#取第i行数据t2[i-1]
print(t2[2])
#取不连续的多行eg:取第2行,第3行,第6行,第8行t2[[2,3,6,8]](两个冒号表示步长)
print(t2[[2,3,6,8],:])
#取连续的多行,切片操作
print(t2[2:])
print("*"*100)
#取第i列数据t2[:,i-1]
print(t2[:,3])
#取连续的多列
print(t2[:,2:])
#取不连续的多列
print(t2[:,[0,3]])
print("*"*100)
#通过行列取某个数
a = t2[2,3]
print(a,type(a))
#取多行多列3-5行,2-4列
t3 = t2[2:5,1:4]
print(t3)
#取多个不相邻的点
t4 = t3[[0,1,2],[0,2,1]]
print(t4)
数值的修改
(三元运算符)
import numpy as np
#普通数组的转置方法
a = np.arange(24).reshape(4,6).T
print(a)
print(a[a>20])#返回大于20的数组成的数组
a[a<10]=3 #小于穷的数被修改为3之后的数组
print(a)
print("*"*100)
#三元运算符操作
x = 3 if 3<2 else 4
print(x)
#numpy中的三元运算符操作
t = np.where(a<=3,100,300)#如何元素小于3就替换为100,否则替换为300
print(t)
clip剪枝
#如果想把数组中小于10的数字替换为0,大于20的数字替换为20,
#类似于剪枝操作,,numpy中的clip操作
import numpy as np
#普通数组的转置方法
a = np.arange(24).reshape(4,6).T
t = a.clip(10,18)
print(t)
#np.nan是一个float类型的数据,如果有缺失,或者做了不合适的计算,用nan表示,比如/0操作
#因为nan不是一个数,所以相关计算都无法得到数字。所有涉及nan的操作,返回的都是nan
print("*"*100)
t = t.astype(float)
t[3,3]=np.nan
print(t)
数组的拼接与行列交换
#numpy读取本地数据
import numpy as np
us_file_path = './US_video_data_numbers.csv'
uk_file_path = './GB_video_data_numbers.csv'
t1 = np.loadtxt(uk_file_path,dtype='int',delimiter=",")
t2= np.loadtxt(us_file_path,dtype='int',delimiter=",")
#数组的拼接
#竖直拼接,要求数组的列数相同!增加数组的行数
t3 = np.vstack((t1,t2))#两个括号!!!
print(t3)
#水平拼接,要求数组的行数相同,增加数组的列数
t4 = np.array([[1,2,3],[3,4,5,],[4,5,6]])
t5 = np.array([[2,3],[3,4],[4,5]])
t6 = np.hstack((t4,t5)) #水平拼接
print(t6)
print("*"*100)
#数组的行列交换
print(t4)
#交换数组两行
t4[[1,2],:] = t4[[2,1],:]
print(t4)
#交换数组两列
t4[:,[1,2]] = t4[:,[2,1]]
print(t4)
数据拼接的应用
#numpy的应用
import numpy as np
us_file_path = './US_video_data_numbers.csv'
uk_file_path = './GB_video_data_numbers.csv'
#加载国家数据
uk_data = np.loadtxt(uk_file_path,dtype='int',delimiter=",")
us_data = np.loadtxt(us_file_path,dtype='int',delimiter=",")
#为两组数据添加国家信息
#构造全为0的数组,代表UK,全为1的数组,代表US
zero_data = np.zeros((uk_data.shape[0],1)).astype("int")#不用科学计数法表示
ones_data = np.ones((us_data.shape[0],1)).astype("int")
#将添加的国家信息拼接到对应国家的数组中
uk_data = np.hstack((uk_data,zero_data))
us_data = np.hstack((us_data,ones_data))
#拼接两组国家的数据
all_data = np.vstack((uk_data,us_data))
print(all_data)
numpy中的随机方法
#numpy的随机方法
import numpy as np
#创建一个全为0或1的数组
t1 = np.zeros((3,4))
t2 = np.ones((2,3))
print(t1,t2)
print("*"*100)
#创建一个对角线为1 的正方形数组(方阵)
t3 = np.eye(3)
print(t3)
print("*"*100)
#获取数组中每一行或者每一列最大值最小值的位置
t4 = np.array([[2,4,5,7],[5,6,9,2]],dtype="int")
print("每一行最大值位置为{0},每一行最小值位置为{1}".format(np.argmax(t4,axis=0),np.argmin(t4,axis=0)))
print("每一列最大值位置为{0},每一列最小值位置为{1}".format(np.argmax(t4,axis=1),np.argmin(t4,axis=1)))
思维导图