5 numpy
重在数值计算
基础库
大型、多维数组执行数值运算
5.1 基本操作
使用numpy创建数组
t1 = np.array([1,2,3,])
print(t1)
print(type(t1))
t2 = np.array(range(10))
print(t2)
t3 = np.arange(4,10,2)
print(t3)
print(t3.dtype)
numpy中的数据类型
t4 = np.arange(4,10,2,dtype='float32')
print(t4)
print(t4.dtype)
t5 = np.array([1,2,0,4,],dtype='bool')
print(t5)
print(t5.dtype)
'''调整数据类型'''
t6 = t5.astype('int8')
print(t6)
print(t6.dtype)
numpy中的小数
t7 = np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)
t8 = np.round(t7,2)
print(t8)
5.2 数组的计算
查看数组的形状
t.shape
返回元组,
不同结果表示的t的类型不同。
元组有:
1个值:一维数组(元素数)
2个值:二维数组(行,列)
3个值:三维数组<每一个元素都是一个二位数组>(块(元素),(每块里的:)行,列)
修改数组的形状
t.reshape
t4 = np.arange(12)
t4.reshape(3,4)
t5 = np.arange(24).reshape(2,3,4)
t5 = t5.reshape(24,)
t5 = t5.reshape(24,1)
t5 = t5.reshape(1,24)
t6 = t5.reshape( ( t5.shape[0]*t5.shape[1], ) )
reshape()方法 有返回值,此处t5调用reshape后无变化
一般有返回值的方法 不会对本身不修改
数组的计算
t4 = np.arange(12)
t4.reshape(3,4)
t5 = np.arange(24).reshape(2,3,4)
t5 = t5.reshape(24,)
t5 = t5.reshape(24,1)
t5 = t5.reshape(1,24)
t6 = t5.reshape( ( t5.shape[0]*t5.shape[1], ) )
5.3 读取本地数据
轴(axis)
0:块方向
1:行方向
2:列方向
读取数据
用的不多,pandas用的多
np.loadtxt(路径,类型,分隔符,跳过某行,读取的列,转置)
import numpy as np
file_path = "./video_data/video_data_numbers.csv"
t1 = np.loadtxt(file_path,delimiter=",",dtype='int',unpack='True')
print(t1)
实现二维数组的转置
import numpy as np
t2 = np.arange(24).reshape((4,6))
t3 = t2.transpose()
t4 = t2.T
t5 = t2.swapaxes(1,0)
5.4 索引和切片
用的非常多!!
print(t2[2])
print(t2[2:])
print(t2[[2,4,8]])
print(t2[:,0])
print(t2[:,2:])
print(t2[:,[2,4,8]])
'''通用方法'''
print(t2[2,:])
print(t2[2:,:])
print(t2[[2,4,8],:])
'''应用'''
a = t2[2,3]
print(a)
print(type(a))
b = t2[2:5 , 0:4]
print(b)
c = t2[ [0,2],[0,1] ]
取到值后 数值修改都水到渠成
numpy中的布尔索引
t2[t2>10] = 3
np.where(t2<=10,0,10)
t2.clip(10,18)
t2 = t2.astype(float)
t2[2:2] = np.nan
出现场合:0/0、∞-∞、本地文件为float且有缺失时
一个数字除以0,python会报错 numpy就是inf/-inf
注意点:
1. 两个nan是不相等的
2. 利用此特性,可以用来判断nan的个数
np.count_nonzero(t2!=t2)
# nan也是非零啊
# t2!=t2 把数组转成了布尔型,只有nan是True
np.count_nonzero(np.isnan(t2))
# 同上
3. nan和任何值计算都是nan
4. 不能单传的把nan赋为0,常把缺失的地方替换为列的均值/中值/删除该行
常用统计方法
t2.sum(axis = 0)
t2.mean(axis = 0)
np.median(t2,axis = 0)
t2.max(axis = 0)
t2.min(axis = 0)
np.ptp(t2,axis = 0)
t.std(axis = 0)
应用:任意数组中的nan替换为均值
以下的都是常规常用的方法,要好好掌握
import numpy as np
def fill_ndarray(t1):
for i in range(t1.shape[1]):
temp_col = t1[:,i]
nan_num = np.count_nonzero(temp_col!=temp_col)
if nan_num != 0:
temp_not_nan_col = temp_col[temp_col == temp_col]
temp_col(np.isnan(temp_col)) = temp_not_nan_col.mean()
return t1
if __name__ == '__main__':
t1 = np.arange(12).reshape((3,4)).astype('float')
t1[1,2:] = np.nan
print(t1)
t1 = fill_ndarray(t1)
print(t1)
数组的拼接
np.vstack((t1,t2))
np.hstack((t1,t2))
t[[1,2],:] = t[[2,1],:]
t[:,[0,2]] = t[:,[2,0]]
zero_data = np.zeros((a_data.shape[0],1))
one_data = np.ones((b_data.shape[0],1))
a_data = np.hstack((a_data,zero_data)).astype(int)
np.eye(3)
np.argmax(t,axis=0)
5.5 生成随机数
np.random
|