文章目录
numpy 数组
大型的数组
安装Numpy
(scrapy_env) C:\Users\Administrator>pip install numpy
创建数组,类型转换,保留小数,array(可迭代的对象)
import numpy as np
import random
import numpy as np
# 一维数组,一层列表
t1=np.array([1,2,3,4])
print(t1)
# 二维数组,二层列表
t2=np.arange(0,24).reshape(4,6)
print(t2)
# 三维数组,三层列表
t3=np.arange(0,24).reshape(2,2,6)
print(t3)
# 创建数组
a=np.array(([1,2,3,4,5]))
t1=np.array([random.random() for i in range(10)])
b=np.array(range(1,6))
c=np.arange(1,6)
print(c)
print(np.random.randint(10,20,(4,5))) #生成随机数组
# < a,b,c 都为class 'numpy.ndarray'>
# 标记位0,1
zeros_data=np.zeros((uk.shape[0],1)).astype(int)# 全0的1列至
ones_data=np.ones((uk.shape[0],1)).astype(int) # 全1的1列值
t=np.eye(4) #对角线位1,其余为0的对称矩阵
print('='*30)
# 创建时指定数据类型
t1=np.array([1,2,3,4],dtype='float32')
print(t1)
t2=np.array([1,0,1,0],dtype=np.bool)
print(t2)
# 转换数组的数据类型
t1=t1.astype(int)
t2=t2.astype(int)
t3=t2.astype(float)
print(t1)
print(t2,t3)
# 保留小数
t1=np.array([random.random() for i in range(10)])
print(t1)
print(np.round(t1,2))
数组维度的转化
import numpy as np
import random
t1=np.arange(12)
t2=np.array([[1,2,3,7],[4,5,6,8]])
t3=np.array([[[1,2,3],[11,12,13]],[[4,5,6],[14,15,16]]])
print(t1.shape)# 一维数组(12,1)
# 一维数组元素个数shape[0]
print(t1.reshape(3,4)) #一维数组转二维
print(t1.reshape(2,2,3))#一维数组转三维
print(np.arange(24).reshape(6,4)) #一维转二维
# 二维数组元素个数shape[0]*shape[1]
print(t2.shape)# 二维数组(2,3)
print(t2.reshape(8,)) #二维转一维
print(t2.flatten()) #二维转一维
print(t2.reshape(t2.shape[0]*t2.shape[1],)) # 不知道二维数组元素多少个,转一维
print(t2.reshape(2,2,2))#二维转三维
## 数组中的行列转换
print(t2)
print(t2.transpose())
print(t2.T)
print(t2.swapaxes(1,0))
# 三维数组元素个数shape[0]*shape[1]*shape[2]
print(t3.shape)# 三维数组(2,2,3)
print(t3.reshape(2,6)) #三维转二维
print(t3.reshape(12,)) #三维转一维
维度计算
任一维度(面)相同或为1,即可加减乘除
#t1一维,t2二维,t3三维
print(t1*2,t2*2,t3*2)
print(t1/2,t2/2,t3/2)
print(t1-2,t2-2,t3-2)
print(t1+2,t2+2,t3+3)
print(t1/0,t2/0,t3/0) #返回nan 不是数字,或者inf 无穷大
t1=np.arange(4).reshape(4,1)
t2=np.arange(16).reshape(4,4)
print(t2-t1,t2*t1)
数组下标取值,修改
从0开始,连续用冒号 不连续用 逗号
gk=np.loadtxt('./GK.csv',dtype=int,delimiter=',')
us=np.loadtxt('./US.csv',dtype=int,delimiter=',')
print(gk)
print('='*30)
# 获取行数据
print(gk[[0,3,4]]) #跨行数据
print(gk[1:9]) #多行数据
print(gk[1]) #单行数据
print('='*30)
#获取列数据
print(gk[:,0]) #单列数据
print(gk[:,0:3]) #多列数据
print(gk[:,[[0,2]]]) #跨列数据
# 多行多列
print(gk[[1,15],0:2])
print(gk[[1,15],[0,2]])
# 修改,
t1=np.arange(16).reshape(4,4)
t1[1:3]=100 #索引修改
t1=np.where(t1>10,0,10) #大于10的,设为0,其他设为10
print(t1.clip(14,18)) #<14 设置为14 >18 设置为18
数组拼接
行列汇总,分组汇总
和,均值,中值,最大值,最小值,极值,标准差
axis=0 为每一列,axis=1 为每一行
# Nan Not a Number
t=np.arange(12).reshape(3,4).astype(float)
print(t)
t[2,3]=np.nan
print(t)
print(np.count_nonzero(t!=t)) #获取nan的个数,不是数字
print(np.count_nonzero(np.isnan(t)))#获取nan的个数,不是数字
# numpy中0轴是列 ,1轴是行
t1=np.array([[1,2,3],[11,12,13]])
print(t1)
# 列的和,行的和
print(t1.sum(axis=0),t1.sum(axis=1))
# 列的平均值,行的平均值
print(t1.mean(axis=0),t1.mean(axis=1))
# 列的最大值,行的最大值
print(t1.max(axis=0),t1.min(axis=1))
# 列的最小值,行的最小值
print(t1.min(axis=0),t1.min(axis=1))
# 列的方差,行的方差, 最大-最小=极值
print(np.std(t1,axis=0),np.std(t1,axis=1))
# 列的极值,行的极值, 最大-最小=极值
print(np.ptp(t1,axis=0),np.ptp(t1,axis=1))
# 列的极值,行的极值, 最大-最小=极值
print(np.median(t1,axis=0),np.median(t1,axis=1))
填充nan为每一列的均值
# Nan Not a Number
# print(t1)
# 吧nan 替换为每一行的均值
for i in range(t1.shape[0]):
# 获取每一列
temp_col=t1[i,:]
# print(temp_col)
zeros_count=np.count_nonzero(t1!=t1)
if zeros_count!=0:#说明有空值
#招到空值列,有值的数字
nan_column=temp_col[temp_col==temp_col]
print(nan_column)
#填充值到nan
temp_col[np.isnan(temp_col)]=nan_column.mean()
print(t1)
# 吧nan 替换为每一列的均值
# 统计nan的个数 TypeError: 'int' object is not iterable, range一下就可以迭代了
for i in range(t1.shape[1]):
temp_t1=t1[:,i]
nan_count=np.count_nonzero(temp_t1!=temp_t1)
if nan_count!=0:
# print(temp_t1==temp_t1)
# 将这一列不为空值的都获取出来
temp_nan_column=temp_t1[temp_t1==temp_t1]
# print(temp_nan_column)
# 在整个当前列中,招到nan 替换为当前列的均值
temp_t1[np.isnan(temp_t1)]=temp_nan_column.mean()
# print(temp_nan_column)
print(t1)
def fill_ndarray(t):
for i in range(t.shape[1]):
temp_col=t[:,i] #这里获取的是每一列
nan_num=np.count_nonzero(temp_col!=temp_col)
if nan_num!=0:#不为0 说明存在了nan
temp_not_nan_col=temp_col[temp_col==temp_col]
#获取nan的当前的一列
temp_col[np.isnan(temp_col)]=temp_not_nan_col.mean()
#吧nan的值,赋值为当前列的平均值
return t
if __name__ == '__main__':
t = np.arange(12).reshape(3, 4).astype(float)
t[2, :3] = np.nan
t=fill_ndarray(t)
print(t)
0值得处理,先赋值为nan,再按nan处理
import numpy as np
t1=np.arange(1,25).reshape((4,6)).astype(float)
t1[2:4,1:3]=0
t1[t1==0]=np.nan
print(t1)
# 吧nan 替换为每一列的均值
for i in range(t1.shape[1]):
temp_col=t1[:,i]
nan_count=np.count_nonzero(temp_col!=temp_col)
# print(nan_count)
if nan_count!=0:
# 不为0 说明了有nan,先取出这一列,不为空值的情况
nan_col=temp_col[temp_col==temp_col]
# print(nan_col)
temp_col[np.isnan(temp_col)]=nan_col.mean(
数组过滤>10的数据
有时需要过滤数据,制作合适的图表
t=np.arange(24).reshape(4,6)
print(t)
t=t[t<10] #[t<10] 这里的t是每一个数组内的值
print(t)