Numpy简介及基本操作
Numpy 高效的运算工具
Numpy的优势
ndarray属性
基本操作
ndarray.方法()
numpy.函数名()
ndarray运算
逻辑运算
统计运算
数组间运算
合并、分割、IO操作、数据处理
3.1 Numpy优势
3.1.1 Numpy介绍 - 数值计算库
num - numerical 数值化的
py - python
ndarray
n - 任意个
d - dimension 维度
array - 数组
3.1.2 ndarray介绍
3.1.3 ndarray与Python原生list运算效率对比
import random
import time
# 生成一个大原生数组
python_list = []
for i in range(100000000):
python_list.append(random.random())
# 生成ndarray数组
ndarray_list = np.array(python_list)
# len(ndarray_list) --100000000
# 原生pythonlist求和
t1 = time.time()
a = sum(python_list)
t2 = time.time()
d1 = t2 - t1
# ndarray求和
t3 = time.time()
b = np.sum(ndarray_list)
t4 = time.time()
d2 = t4 - t3
print(d1) # 0.7309620380401611
print(d2) # 0.12980318069458008
3.1.4 ndarray的优势
1)存储风格
ndarray - 相同类型 - 通用性不强
list - 不同类型 - 通用性很强
2)并行化运算
ndarray支持向量化运算
3)底层语言
C语言,解除了GIL
3.2 认识N维数组-ndarray属性
3.2.1 ndarray的属性
shape
ndim
size
dtype
itemsize
在创建ndarray的时候,如果没有指定类型
默认
整数 int64
浮点数 float64
3.2.2 ndarray的形状
a = np.array([[1,2,3],[4,5,6]])
b = np.array([1,2,3,4])
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
a # (2, 3)
array([[1, 2, 3],
[4, 5, 6]])
b # (4,)
array([1, 2, 3, 4])
c # (2, 2, 3)
array([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
练习:
[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]]
[[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]],
3.2.3 ndarray的类型
3.3 基本操作
adarray.方法()
np.函数名()
np.array()
3.3.1 生成数组的方法
1)生成0和1
np.zeros(shape)
np.ones(shape)
2)从现有数组中生成
np.array() np.copy() 深拷贝
np.asarray() 浅拷贝
3)生成固定范围的数组
np.linspace(0, 10, 100)
[0, 10] 等距离
np.arange(a, b, c)
range(a, b, c)
[a, b) c是步长
4)生成随机数组
分布状况 - 直方图
1)均匀分布
每组的可能性相等
2)正态分布
σ 幅度、波动程度、集中程度、稳定性、离散程度
案例:随机生成8只股票2周的交易日涨幅数据
stock_change = np.random.normal(loc=0, scale=1, size=(8, 10))
3.3.2 数组的索引、切片
3.3.3 形状修改
ndarray.reshape(shape) 返回新的ndarray,原始数据没有改变
ndarray.resize(shape) 没有返回值,对原始的ndarray进行了修改
ndarray.T 转置 行变成列,列变成行
3.3.4 类型修改
ndarray.astype(type)
ndarray序列化到本地
ndarray.tostring()
3.3.5 数组的去重
np.unique(temp)
set(temp.flatten())
set(temp) # 报错
3.4 ndarray运算
逻辑运算
布尔索引
通用判断函数
np.all(布尔值)
只要有一个False就返回False,只有全是True才返回True
np.any()
只要有一个True就返回True,只有全是False才返回False
np.where(三元运算符)
np.where(布尔值, True的位置的值, False的位置的值)
统计运算
统计指标函数
min, max, mean, median, var, std
np.函数名
ndarray.方法名
返回最大值、最小值所在位置
np.argmax(temp, axis=)
np.argmin(temp, axis=)
3.5 数组间运算
3.5.1 场景
3.5.2 数组与数的运算
arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr / 10
array([[0.1, 0.2, 0.3, 0.2, 0.1, 0.4],
[0.5, 0.6, 0.1, 0.2, 0.3, 0.1]])
3.5.3 数组与数组的运算
满足广播机制
3.5.4 广播机制
eg:不满足广播机制
arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])
print(arr1.shape) # (2, 6)
print(arr2.shape) # (2, 4)
# print(arr1 + arr2) 报错
eg:满足广播机制
arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1], [3]])
print(arr1.shape) # (2, 6)
print(arr2.shape) # (2, 1)
arr1 + arr2
array([[2, 3, 4, 3, 2, 5],
[8, 9, 4, 5, 6, 4]])
3.5.5 矩阵运算
1 什么是矩阵
矩阵matrix 二维数组
矩阵 & 二维数组
两种方法存储矩阵
1)ndarray 二维数组
矩阵乘法:
np.matmul
np.dot
2)matrix数据结构
2 矩阵乘法运算
形状
(m, n) * (n, l) = (m, l)
运算规则
A (2, 3) B(3, 2)
A * B = (2, 2)
3.6 合并、分割
3.6.1 合并
a = stock_change[:2, 0:4]
b = stock_change[4:6, 0:4]
a
array([[ 1.1 , -0.45576704, 0.29667843, 0.16606916],
[ 0.36775845, 0.24078108, 0.122042 , 1.1 ]])
a.shape
(2, 4)
a.reshape((-1, 2))
array([[ 1.1 , -0.45576704],
[ 0.29667843, 0.16606916],
[ 0.36775845, 0.24078108],
[ 0.122042 , 1.1 ]])
b
array([[-0.9822216 , -1.09482936, -0.81834523, 1.1 ],
[ 0.41739964, -0.26826893, -0.70003442, -0.58593912]])
# 横向合并,两种操作等价
np.hstack((a, b))
np.concatenate((a, b), axis=1)
array([[ 1.1 , -0.45576704, 0.29667843, 0.16606916, -0.9822216 ,
-1.09482936, -0.81834523, 1.1 ],
[ 0.36775845, 0.24078108, 0.122042 , 1.1 , 0.41739964,
-0.26826893, -0.70003442, -0.58593912]])
# 纵向合并,两种操作等价
np.vstack((a, b))
np.concatenate((a, b), axis=0)
array([[ 1.1 , -0.45576704, 0.29667843, 0.16606916],
[ 0.36775845, 0.24078108, 0.122042 , 1.1 ],
[-0.9822216 , -1.09482936, -0.81834523, 1.1 ],
[ 0.41739964, -0.26826893, -0.70003442, -0.58593912]])
3.7 IO操作与数据处理
3.7.1 Numpy读取
只能读取相同类型的,读不出来为nan
data = np.genfromtxt("test.csv", delimiter=",")
data
array([[ nan, nan, nan, nan],
[ 1. , 123. , 1.4, 23. ],
[ 2. , 110. , nan, 18. ],
[ 3. , nan, 2.1, 19. ]])
3.7.2 如何处理缺失值
两种思路:
直接删除含有缺失值的样本
替换/插补
按列求平均,用平均值进行填补
eg:用平均值填充
def fill_nan_by_column_mean(t):
for i in range(t.shape[1]):
# 计算nan的个数
nan_num = np.count_nonzero(t[:, i][t[:, i] != t[:, i]])
if nan_num > 0:
now_col = t[:, i]
# 求和
now_col_not_nan = now_col[np.isnan(now_col) == False].sum()
# 和/个数
now_col_mean = now_col_not_nan / (t.shape[0] - nan_num)
# 赋值给now_col
now_col[np.isnan(now_col)] = now_col_mean
# 赋值给t,即更新t的当前列
t[:, i] = now_col
return t
fill_nan_by_column_mean(data)
array([[ 2. , 116.5 , 1.75, 20. ],
[ 1. , 123. , 1.4 , 23. ],
[ 2. , 110. , 1.75, 18. ],
[ 3. , 116.5 , 2.1 , 19. ]])