目录
1. numpy详解
1.1 array函数使用
numpy.array(object,dtype=none,copy=True,order=none,subok=False,ndmin=0)
参数说明:
- 1.object:表示一个数据序列
- 2.dtype:可以修改数据类型
- 3.copy:数组能否被复制
- 4.ndmin:指定数据维度
- 5.subok:默认使用object内部数据类型
在使用numpy内部模块时,都需要导入模块:
import numpy as np
- array在传入数据序列时,可以是列表,元组或者是迭代器,如:
# 放入列表
a = np.array([1, 2, 3, 4, 5])
print(type(a)) # 转变成numpy数组类型
# 放入元组
b = np.array((1, 2, 3, 4, 5))
print(type(b)) # 转变成numpy数组类型
# 放入迭代器
c = np.array(range(10)) # 把迭代器的数据保存为一个数组
print(c)
- 在传入的数据序列中如果有一个元素是浮点型,所有的元素都会被转变为数组的浮点型,可以使用dtype参数强制转换为int类型,如果是浮点类型转换为整形会向下取整:
# 浮点型
e = np.array([1, 2, 3.14, 4, 5]) # 有一个为浮点型都会转换成浮点型
print(e)
e = np.array([1, 2, 3.14, 4, 5], dtype='int') # 使用dtype强制转换为int类型
- 当object参数传入两个元素相同的序列时,会变成一个二维数据,使用 数组名.ndim可以查看数组的维度,使用 数组名.shape 可以查看数组的行列情况:
# 嵌套数组 f = np.array([[1, 2, 3, 4, 5], ('a', 'b', 'c', 'd', 'e')]) # 两个序列的数据数量一样才可以转换成二维的 print(f.ndim) # 查看维度 print(f.shape) # 查看行列情况 print(f)
- array在复制中,使用 arr2 = np.array(arr1) 这样的复制类型,是一种深拷贝,拷贝出来的地址是不一样的,使用 arr2 = arr1 这样的复制类型,是一种浅拷贝,只要有一个元素改变,另一个也会改变:
# 复制操作 arr1 = np.array([1, 2, 3, 4, 5]) 深拷贝 arr2 = np.array(arr1) # 在这里的复制是深拷贝,而列表中的复制是浅拷贝 print('arr1:', id(arr1), 'arr2:', id(arr2)) # id 可以输出变量的地址 # 浅拷贝 arr3 = arr1 # 这种拷贝修改任何一个另一个都会跟着修改
1.2 arange函数的使用
numpy.arange(start,stop,step,dtype)
参数说明:
- 1.start:起始值,默认为0
- 2.stop:终止值,不包含
- 3.step:步长,默认为1
- 4.dtype:返回数组类型
使用该函数可以只传递stop参数,也可以指定参数名,如step=2,当数据过大时,输出结果会以省略号替代:
# 整形
num1 = np.arange(10)
print(num1)
# 浮点型
num2 = np.arange(10.0)
print(num2)
# 限定终值和步长
num3 = np.arange(2, 30, 2)
print(num3)
# 参数指定
num4 = np.arange(20, step=3)
print(num4)
# 数据太大会自动跳过
num5 = np.arange(10000)
print(num5)
1.3 linspace函数使用
numpy.linspace(start,stop,num,endpoint,retstop,dtype) 这是一个生成等差数列的函数
参数说明:
- 1.num:生成的元素个数
- 2.endpoint:这是一个bool类型的参数,为True时会包含stop值
- 3.retstop:这是一个bool类型的参数,为True时生成的数据会显示间距
linspace返回的数组中元素都是浮点型,例子:
# 等步长生成
num1 = np.linspace(1, 10, 10) # 输出浮点型
print(num1)
#
num2 = np.linspace(0, 4, 9)
print(num2)
num3 = np.linspace(0, 4.1, 9)
print(num3)
# 设置endpoint参数
num4 = np.linspace(2.0, 3.0, num=5, endpoint=True)
print(num4)
# 设置显示retstep显示计算后的步长
num5 = np.linspace(2.0, 3.0, num=5, retstep=True)
print(num5)
1.4 logspace函数使用
numpy.logspace(start,stop,num,endpoint,base,dtype) 这是一个生成等比数列的函数
参数说明:
- 1.num:要生成的等步长的元素数量
- 2.endpoint:这是一个bool类型的参数,为True时会包含stop值
- 3.base:对数log的底数,默认为10
该函数使用返回的结果都是浮点型,例子:
# base指定底数
num1 = np.logspace(0, 9, 10, base=2) # 返回结果都是浮点型
print(num1)
# 使用前三个数均分为等份的数
num2 = np.logspace(1, 5, 3, base=2)
print(num2)
1.5 数组元素的属性
- ndim:查看数组的维度
- shape:查看数组行列的情况
- size:查看数组元素的总个数
- dtype:数组的元素类型
- itemsize:数组中每个元素的大小
上面属性的使用都在以下的代码段中,属性 reshape(元组),可以改变数组的维度, resize(数组,元组),这里会重新改变数组维度,并且会重复填写数组的元素,例子:
# shape:查看行列,ndim:查看维度,size:数组元素个数
# 一维数组
num1 = np.array([1, 2, 3, 4, 5])
print('num1的维度:', num1.ndim)
print('num1的数组元素个数:', num1.size)
print('一维数组:', num1.shape)
print('元素大小:', num1.itemsize)
# 二维数组
num2 = np.array([[1, 2, 3], [4, 5, 6]])
print('num2的维度:', num2.ndim)
print('num2的数组元素个数:', num2.size)
print('二维数组:', num2.shape)
# 三维数组
num3 = np.array([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 4],
[4, 5, 6]]])
print('num3的维度:', num3.ndim)
print('num3的数组元素个数:', num3.size)
print('三维数组:', num3.shape)
# reshape 改变维度
a = np.arange(20).reshape((4, 5))
print(a)
# resize:如国新数组大于原始数组,新数组将填充a的重复副本
b = np.arange(20)
c = np.resize(b, (4, 6))
print(c)
1.6 数组的切片和索引
1.6.1 一维数组
一维数组的切片和索引与列表的一样:
# 一维数组操作
# 数组切片索引和列表的一样
a = np.array([1, 2, 3, 4, 5])
print(a[2:4:2])
# 使用下标切成不重叠的两部分
print('a[:2]:', a[:2])
print('a[2:]:', a[2:])
1.6.2 二维数组
下面例子中,第五个是在二维数组中取出了第二第三行,变成一个两行四列的数组,再从中取出第二行数据,例子:
# 二维数组操作
num1 = np.array(range(20)).reshape(4, 5)
print(num1[2]) # 拿到一行数据
print(num1[2][2]) # 拿到一个数据
print(num1[2, 2]) # 第一个操作行,第二列操作列
print(num1[2:, 2:]) # 可以对数组行列各自操作
print(num1[2:][1]) # 第一个参数先取出行,第二个参数再取出行
print(num1[2:]) # 对行数进行切片
以坐标当索引,例子:
# 用坐标当索引
num2 = np.array(range(12)).reshape(3, 4)
rest1 = num2[[0, 1, 2], [0, 0, 0]] # 以坐标作为索引,第一列参数是行坐标,第二列参数为列坐标
rest2 = num2[:2, :2] # 取出范围内的数据,按会以矩阵形式输出
1.6.3 bool运算
在使用bool类型数组进行数据取出时,True类型的数量必须要一致,例子:
# bool运算:可以使用算式拿到想要的数据
num3 = np.array(range(12)).reshape(3, 4)
print(num3[num3 > 6]) # 返回所有数值大于6的数字
print(num3[num3 % 2 == 1]) # 返回奇数
print(num3[(num3 > 4) & (num3 < 9)]) # &:和的意思
print(num3[(num3 < 4) | (num3 > 9)]) # |:或的意思
row1 = np.array([True, False, True]) # 作为一个数组作用到另一个数组上,行和列一一对应,当为True时,即拿到该行数据,否则不能
colum1 = np.array([True, False, True, False])
print(num3[row1, colum1]) # 合用时True数量要一致
print(num3[row1])
print(num3)
temp = num3[::2] # 先拿出行
temp = temp[:, [0, 2, 3]] # 再拿出列
print(temp)
1.6.4 广播机制
广播机制其实就是数组的运算,例子:
# 广播机制:不同的数组进行计算,数组的列必须相同,且必须有一个数组是单个值
num4 = np.array([1, 2, 3, 4])
num5 = np.array([10, 20, 30, 40])
print(num4*num5) # 相同维度的运算
num6 = np.array([[1, 2, 3, 4], [10, 20, 30, 40], [100, 200, 300, 400]])
num7 = np.array([[2, 3, 4, 5]]) # 数组的运算必须要列的长度相同
# 在数组运算中行是和行相乘的,一行对应一行,当列数为1时,无论多少行都可以相乘,如 {(2,1)和(2, 4)} {(2, 1)和(1, 4)}
num8 = np.array([[1], [2]])
num9 = np.array([[1, 2, 3, 4], [2, 3, 4, 5]])
print(num8*num9) # 不同维度的运算
1.7 numpy函数
1.7.1 mean:求平均数
例子:
# mean:求平均数
num1 = np.array(range(20)).reshape(4, 5)
print(num1.mean()) # 计算数组中的函数
print(num1.mean(axis=0)) # axis=0 按列从上往下运算
print(num1.mean(axis=1)) # axis=1 按行从左往右
1.7.2 median:求中位数
例子:
# median:中位数
num2 = np.array(range(12)).reshape(3, 4)
print(np.median(num2)) # median:找到数组中的中位数
1.7.3 std:标准差
例子:
# std:标准差
num3 = np.array([95, 85, 75, 65, 55, 45])
num4 = np.array([73, 72, 71, 69, 67, 68])
print(np.std(num3)) # 求标准差
print(np.std(num4))
1.7.4 max:求最大值,min:求最小值
例子:
# max:最大值 min:最小值
num5 = np.array([[1, 3, 5, 3, 6, 99, 4, 7], [4, 4, 1, 2, 7, 2, 2, 55]])
print(num5.max(axis=0), num5.max(axis=1)) # 找最大值 axis=0:从上往下找,axis=1:从左往右找
print(num5.min()) # 找最小值
1.7.5 sum:求和
例子:
# sum:求和
num6 = np.array(range(20)).reshape(4, 5)
print('从上往下累加:', num6.sum(axis=0), '从左往右累加:', num6.sum(axis=1))
1.7.6 average:加权平均数
例子:
# average:加权平均值
num7 = np.array([30, 55, 63])
weights = np.array([0.3, 0.3, 0.4]) # 权重
print(np.average(num7, weights=weights)) # 权重和数组行列数一致
1.8 numpy文件操作
关键字:loadtxt
loadtxt(fname,dtype,comments,delimiter,coverters,skiprows,usecols,unpack,ndmin,encoding)
参数说明:
- 1.fname:文件名称,支持压缩文件
- 2.comments:字符串或字符串组成的列表
- 3.delimiter:字符串,作为分割字符
- 4.converters:字典
- 5.skiprows:跳过特定行数据
- 6.usecols:传入的参数是元组,取出特定列
- 7.unpack:bool类型
- 8.encoding:编码方式
使用例子:
# txt文件
data = np.loadtxt('1.txt', dtype='int8')
print(data)
# csv文件
data1 = np.loadtxt('3.csv', dtype='int32', delimiter=',', encoding='utf8') # delimiter:使用了 , 分割符
print(data1)
# csv中不同的数据类型
# dt是一个自定义类型,为了符合csv文件中的数据类型
dt = np.dtype([('name', 'U10'), ('age', 'int'), ('weight', 'float')]) # 字符串需要的字符格式 Un
data2 = np.loadtxt('2.csv', dtype=dt, delimiter=',', encoding='utf8') # 文件中一行是一个元组,返回的是列表
print(data2['name'])
print(data2)
# 跳行使用 skiprows
data3 = np.loadtxt('4.txt', dtype=dt, skiprows=1, encoding='utf8') # 文件中一行是一个元组,返回的是列表,跳过第一行
print(data3)
# 取出特定列:文件中的列是从0开始数
data4 = np.loadtxt('4.txt', usecols=(1, 2), skiprows=1, encoding='utf8') # usecols用元组的方式取出数据
print(data4)
使用自定义类型去判断获取数据:
# 计算女生的平均身高
dt1 = np.dtype([('name', 'U10'), ('sex', 'U1'), ('age', 'int'), ('height', 'int')])
data5 = np.loadtxt('5.txt', dtype=dt1, skiprows=1, encoding='utf8')
print(data5)
isgirl = (data5['sex'] == '女') # 判断是否是女生
print(isgirl)
height = data5['height'][isgirl] # 拿到身高
print(np.mean(height)) # 算出平均身高
1.9 numpy随机数
例子:
# 生成分布均匀的随机数
avg = np.random.rand(1, 3, 3) # 第一个参数是范围,第二个参数是组数,第三个参数是每组中的列数
print(avg)
# 和 rand 一样,但是生成的是一组正态分布的数
avg1 = np.random.random(3)
print(avg1)
# 随机生成整数:random(low,high,size,dtype)
# 1.返回随机数,范围区间在[low,high],包含low,不包含high
# 2.low:最小值 high:最大值 size:数组维度大小 dtype:数据类型
# 3.high没有填写时默认随机数范围[0,low]
avg2 = np.random.randint(1, 20, size=(2, 4, 5)) # 生成两个3行4列的二维数组
print(avg2)
# sample:随机生成0到1的随机数,参数控制数量
avg3 = np.random.sample(3)
print(avg3)
# seed:随机种子,控制每次生成随机数时数据都一样
np.random.seed(2)
a = np.random.randn(3, 3)
np.random.seed(2) # 每次调用随机数时都要先调用随机数种子
b = np.random.randn(3, 3)
print('a', a)
print('b', b)
# 正态分布函数:normal(参数1,参数2,元组)
# 1.参数1:均值
# 2.参数2:是标准差
# 3.元组:控制生成的是几行几列
avg4 = np.random.normal(1, 3, (2, 4))
print(avg4)
2.0 其它函数
- resize:返回指定形状的新数组
- append:将元素添加到数组的末尾
- insert:按规定的轴将元素值插入到指定的元素
- delete:删掉某个轴上的子数组,并返回新数组
- argwhere:返回数组内符合条件的索引值
- unique:删除数组中的重复元素,并按从大到小返回一个新数组
- sort:对数组进行排序,并返回一个副本
- argsort:按指定的轴,对数组进行排序,并返回排序后元素的索引数组
例子:
# resize:使用
num1 = np.array(range(20)).reshape(4, 5) # 重复填充
print(np.resize(num1, (5, 7)))
# append:使用
num2 = np.array([[1, 2, 3], [4, 5, 6]])
print(np.append(num2, [[7, 8, 9]])) # 添加数据
print(np.append(num2, [[7, 8, 9]], axis=0)) # 沿轴 0 添加元素 从上往下
print(np.append(num2, [[7, 8, 9], [10, 11, 12]], axis=1)) # 沿轴 1 添加元素 从左往右
# insert:使用
num3 = np.array([[1, 2], [2, 3], [3, 4]])
print(np.insert(num3, 1, [11], axis=0)) # 从上往下的第二行加入11
print(np.insert(num3, 1, [11], axis=1)) # 从左往右的第二列加入11
# delete:使用
num4 = np.array(range(12)).reshape(3, 4)
print(np.delete(num4, 1)) # 删除指定索引的元素
print(np.delete(num4, [1, 2, 3, 6])) # 删除指定元素
# argwhere:使用
num5 = np.array([[1, 2, 3], [4, 5, 6]])
print(np.argwhere(num5 > 3)) # 返回了索引值
# unique:使用
num6 = np.array([1, 2, 2, 3, 6, 4, 7, 3, 5])
print(np.unique(num6)) # 去重,并从小到大排序
a, b = np.unique(num6, return_index=True) # 返回去重后的数组,和原在原数组时的索引位置
print(a, '\n', b)
c, d = np.unique(num6, return_counts=True) # 返回数组,以及元素在原数组中出现的次数
print(c, '\n', d)
# sort:使用
num7 = np.array([[1, 3, 2], [4, 3, 6], [2, 1, 3]])
print(np.sort(num7)) # 默认是从左到右排序
print(np.sort(num7, axis=0)) # 从上到下排序
# argsort:使用
num8 = np.array([1, 4, 2, 6, 1])
print(np.argsort(num8)) # 返回排序后的索引值