文章目录
- numpy
- numpy 创建数组(矩阵)
- 数组的形状
- numpy读取本地数据和索引
- 读取数据
- numpy的四种转置方式
- numpy的索引和切片
- numpy中数值的修改
- 数组的拼接
- 数组的行列交换
- numpy的注意点
- numpy中的nan和inf
- numpy中nan的注意点
- numpy中常用统计函数
numpy
帮助处理数值型数据,是python科学计算库的基础库 import numpy as np
numpy 创建数组(矩阵)
<class 'numpy.ndarray'>
- 以下三种情况相同
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array(range(1,6))
arr3 = np.arange(1, 6)
# [1 2 3 4 5] 注意arange和array区别
- 数据的类型:
arr4 = np.array(range(1,4), dtype="float")
print(arr4.dtype) # float64
print(arr4.astype("int8").dtype()) # int8
# i1--->int8
# float--->float64
# 略
print(np.round(random.random(), 2)) # 保留两位小数
数组的形状
t1 = np.arange(12)
print(t1.shape) # (12,)
t2 = np.array([[1,2,3],[4,5,6]])
print(t2.shape) # (2, 3)
print(t2.reshape(t2.shape[0]*t2.shape[1],)) # 未知总长度,知道维度,变一维
print(t2.flatten()) # 变一维
t3 = np.arange(24).reshape((2,3,4)) # 改变数组形状,2*3*4
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
numpy的一个广播机制: 数组+数字 是 给数组中每个位置都加这个数
0/0=nan 数字/0=inf(无穷 )
数组相减:按照减数的维度在被减数上减小
广播会在缺失和长度为1的维度上进行
numpy读取本地数据和索引
在numpy中可以理解为方向,使用0,1,2…数字表示,对于三维数组(shape(2,2,3)),有0,1,2轴
计算一个二维数组的平均值,必须指定是哪个方向上的数字平均值
读取数据
- CSV:Comma-Separated Value 逗号分隔值文件
np.loadtxt(frame,dtype="int",delimiter=None,skiprows=0,usecols=None,unpack=False)
- frame:文件、字符串或产生器,可以是.gz或.bz2压缩文件
- dtype:数据类型,可选,CSV的字符串以什么数据类型读入数组中,默认np.float
- delimiter:分割字符串,默认是任何空格,改为逗号
- skiprows:跳过前X行,一般跳过第一行表头
- usecols:读取指定的列,索引,元组类型
- unpack:如果True,转置,如果False,不变,默认False
numpy的四种转置方式
转置是一种变化,为了更方便的处理数据
方法1:读入的时候转置
t1 = np.loadtxt(file_path,delimiter=",",dtype="int",unpack=True)
方法2:
arr1.transpose()
方法3:
arr1.swapaxes(1,0)
方法4:
arr1.T
numpy的索引和切片
a = array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
# 取一行
a[1] = array([4, 5, 6, 7])
# 取多行
a[1:3] = array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
# 取一列
a[:,2] = array([ 2, 6, 10])
# 取多列
a[:,2:4] = array([[ 2, 3],
[ 6, 7],
[10, 11]])
# 加上步长
a[[0,2],:] = 取第0和第2行
a[:,[0,3]] = 取第0和第3列
# 取第3行到第5行,第2列到第4列的结果
a[2:5,1:4]
# 取多个不相邻的点 arr[0][1],arr[2][2]
a[[0,2],[1,2]]
## 数值类型是numpy.int64或32
numpy中数值的修改
# 普通修改
a[:,2:4] = 0
# 条件修改
## 把a中小于10的改成3
a[a<10] = 3
## 三元运算符
a.where(t<10, 0, 10)
## clip
a.clip(10,18) # 小于10的替换为10,大于18的替换为18
#### nan不会被替换,nan是float型的值,要把某个值设为non,需要先转换为float型,再=non ####
数组的拼接
temp = np.vstack((t1,t2)) # 竖直拼接(vertically)
temp = np.hstack((t1,t2)) # 水平拼接(horizontally)
数组的行列交换
t = array([[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])
t[[1,2],:] = t[[2,1],:] # 行交换
array([[12, 13, 14, 15],
[20, 21, 22, 23],
[16, 17, 18, 19]])
t[:,[0,2]] = t[:,[2,0]] # 列交换
array([[14, 13, 12, 15],
[22, 21, 20, 23],
[18, 17, 16, 19]])
构造一个全为0的数组,且int类型:
np.zeros((t.shape[0],1)).astype(int)
构造一个全为1的数组,且int类型:np.ones((t.shape[0],1)).astype(int)
创建一个对角线为1的正方形数组(方阵)np.eye(3)
np.count_nonzero(t2)
返回数组中不为0的个数获得每行最大值最小值的位置
np.argmax(t,axis=0)
np.argmin(t.axis=1)
- 正态分布:中间高,两头低
- 均匀分布:在相同的大小范围内出现概率是等可能的
numpy的注意点
- a=b 完全不复制,a和b相互影响
- a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,互相影响
- a = b.copy(),复制,互不影响
numpy中的nan和inf
nan(NAN,Nan):not a number表示不是一个数字
什么时候出现nan:
- 当读取文件为float时候,如果有缺失,就会出现nan
- 当做了一个不合适的计算(eg:无穷大(inf)减去无穷大)
inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷
什么时候出现inf(-inf,+inf):
- 比如一个数字除以0,(python中会直接报错,numpy中是一个inf或-inf)
numpy中nan的注意点
- 两个nan是不相等的
np.nan!=np.nan
为True
-
np.count_nonzero(t)
返回数组中不为0的个数,np.count_nonzero(t!=t)
返回数组中nan的个数。 -
np.isnan(t)
数组的值是不是nan,t[np.isnan(t)] = 0
把nan全部替换0。 - nan和任何值计算都为nan
在一组数据中,单纯把nan替换为0,有影响!!!
替换后,会对平均值大小产生影响,所以应该把缺失的数值替换为均值(中值)或者直接删除有缺失的一行
numpy中常用统计函数
求和:t.sum(axis=None)
均值:t.mean(a.axis=None)
受离群点的影响较大
中值:np.median(t,axis=None)
最大值:t.max(axis=None)
最小值:t.min(axis=None)
极值:np.ptp(t,axis=None)
即最大值和最小值只差
标准差:t.std(sxis=None)
默认返回多维数组的全部的统计结果,如果指定axis,则返回一个当前轴上的结果