numpy学习
创建数组
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array(range(1,6))
c = np.arange(1,6)
print(a)
print(b)
print(c)

上面3个做法创建的都是同一个数组。
数组的类名和数据的类型:
a = np.array([1,2,3])
print(type(a)) # 类名
print(a.dtype) # 数据的类型

一些常见的数据类型:

创建指定数据类型的数组:
a = np.array([1,0,1,0],dtype='?')
print(a)

修改数据类型:
a = np.array([1,0,1,0],dtype='?')
print(a)
a = a.astype("i2") # astype返回一个array,不会影响对象本身
print(a.dtype)
print(a)

保留固定位小数:
b = np.array([0.114514,0.1919810])
print(b)
print(np.round(b,2))

数组的形状
a = np.array([[1,1,4,5,1,4],[1,9,1,9,9,1]])
print(a)
print(a.shape) # 查看a的形状
b = a.reshape(3,4) # 改变a的形状
print(b)

转化成一维数组:
a = np.array([[1,1,4,5,1,4],[1,9,1,9,9,1]])
print(a.reshape(1,12))# 错误做法
print(a.flatten()) # 正确做法

数组和数的计算
a = np.array([[1,1,4,5,1,4],
[1,9,1,9,9,1]])
print(a+1)
print(a*3)
运算的广播机制,作用于所有元素

a = np.array([[1,1,4,5,1,4],
[1,9,1,9,9,1]])
b = np.array([[1,1,4,5,1,4],
[1,9,1,9,9,1]])
print(a+b) # 一一对应相加
print(a*b) # 一一对应相乘

广播原则

比如说这样是不行的:
import numpy as np
a = np.array([[1,1,4,5,1,4],
[1,9,1,9,9,1]])
b = np.array([[1,1,4,5,1,4],
[1,9,1,9,9,1],
[1,9,1,9,9,1]])
print(a*b)


这样又行了(其中一方的长度为1):
import numpy as np
a = np.array([1,1,4,5,1,4]) # (1,6),其实这里是一维的,应该是(6,)
b = np.array([[1,1,4,5,1,4],
[1,9,1,9,9,1],
[1,9,1,9,9,1]])
print(a+b)
print(a*b)

axis轴
在numpy中可以理解为方向,使用0,1,2...数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴


numpy读取本地数据

import as np
path = "xxxxxx.csv" # 假设读了一个csv
t1 = np.loadtxt(path,delimiter=',',dtype='int',unpack=True) # 需要知道文件以什么符号为分割符(假设','分隔),unpack=True相当于矩阵转置

这些方法都可以实现转置。
索引和切片
import numpy as np
a = np.array([[1,1,4,5,1,4],
[1,9,1,9,9,1],
[1,9,1,9,9,1]])
print(a[1]) # 取1行
print(a[1:3]) # 切片(左闭右开)
print(a[0:3:2]) # 加上步长
print(a[:,2]) # 取下标为2的列
print(a[:,2:4]) # 切片
print(a[0:2,2:4]) # 也是可以用a[[0,2],[2,4]]来取,

如果要选定某些行或者某些列切片:
a[:,[2,4]] # 前面必须加冒号,选列24
print(a[[0,1,2],:]) # 选择012行

筛选出值小于x的数据
import numpy as np
a = np.array([[1,1,4,5,1,4],
[1,9,1,9,9,1],
[1,9,1,9,9,1]])
print(a<5)
print(a[a<8])
b = a
b[b<8] = 0 # 筛选赋值
print(b)
c = np.where(a<5,2,3) # 三元运算符,小于5的全部赋值2,否则3
print(a)
print(c)
d = a.clip(3,6) # 把小于3的赋值为3,大于6的赋值为6
print(d)



numpy中的nan
nan和inf是float类型,并且nan!=nan
a=np.inf
print(type(a))
a=np.nan
print(type(a))
print(np.nan==np.nan)



那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?
比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行
常用统计函数
axis参数表示对哪一个轴方向求结果。

一些其他操作
拼接数组(shape得合法,否则会报错):
a = np.array([[1,1,4,5,1,4],
[1,9,1,9,9,1],
[1,9,1,9,9,1]])
b = np.array([[1,1,4,5,1,4],
[1,9,1,9,9,1],
[1,9,1,9,9,1]])
print(np.vstack((a,b))) # 竖直拼接
print(np.hstack((a,b))) # 水平拼接


交换行列:
a = np.array([[1,1,4,5,1,4],
[1,9,1,9,9,1],
[1,9,1,9,9,1]])
#交换行
a[[0,2]] = a[[2,0]]
print(a)
#交换列
a[:,[0,2]] = a[:,[2,0]]
print(a)






浙公网安备 33010602011771号