Numpy库
文章目录
1 Numpy库的安装
用于数据处理(矩阵处理)
确定库是否安装成功: python3 -c “import numpy” 没有提示信息则安装成功
2 基本操作
2.2 数据维度 | 创建数据 np.array() array.ndim 数组维度 1 2 3 添加合并数据 np.concatenate() 合并数组 np.expand_dims() 数组升维 np.vstack()竖向合并 np.hstack()横向合并 观察形态 array.size 数组中元素总个数 array.shape 各个维度的元素个数 (2,3) |
2.3数据选择 | 单个选取 array[1] array[1,2,3] array[1][1] 切片划分 array[:3] array[2:4(x), 1:3(y)] 条件筛选 array[array<0] np.where(array, array < 0) |
2.4基础运算 | 加减乘除 +-*/ np.dot() 数据统计分析 np.max() np.min() np.sum() np.prod() np.count() np.std() np.mean() np.median() 特殊运算符号 np.argmax() np.argmin() np.ceil() np.floor() np.clip() |
2.5改变数据形态 | 改变形态 array[np.newaxis, :] array.reshape() array.ravel(), array.flatten() array.transpose() 合并 np.column_stack(), np.row_stack() np.vstack(), np.hstack(), np.stack() np.concatenate() 拆解 np.vsplit(), np.hsplit(), np.split() |
2.1 Numpy和Python List 的区别
2.1.1 Numpy Array np.array()
使用Numpy Array定义数组:
import numpy as np
np.array([1,2,3])
np.array(list)
2.1.2 List和Numpy Array的共同点
- 存储与读取相同
my_list = [1,2,3]
print(my_list[0])
my_array = np.array([1,2,3])
print(my_array[0])
- 修改相同
my_list[0] = 0
my_array[0] = 0
print(my_list)
print(my_array)
- Numpy数组存储在连续的物理地址,运算速度快于List
- Numpy Array 存储的数据格式有限制,同一种数据格式有利于批量的数据计算
import numpy as np
import time
t0 = time.time() #记录时刻
# python list
l = list(range(100))
for _ in range(10000):
for i in range(len(l)):
l[i] += 1 #每个位置+1
t1 = time.time()
# numpy array
a = np.array(l)
for _ in range(10000):
a += 1 #整个数组一起+1
print("Python list spend {:.3f}s".format(t1-t0))
print("Numpy array spend {:.3f}s".format(time.time()-t1))
2.2 数据维度
涉及功能:
创建数据
np.array()
array.ndim 数组维度 1 2 3
添加合并数据
np.concatenate() 合并数组
np.expand_dims() 数组升维
np.vstack()竖向合并
np.hstack()横向合并
观察形态
array.size 数组中元素总个数
array.shape 各个维度的元素个数 (2,3)
2.2.1 创建数据
#一维数据
import numpy as np
cars = np.array([5, 10, 12, 6])
print("数据:",cars,"\n维度:",cars.ndim)
#二维数据
import numpy as np
cars = np.array([
[5, 10, 12, 6],
[5.1, 8.2, 11, 6.3]
])
print("数据:",cars,"\n维度:",cars.ndim)
#三维数据
import numpy as np
cars = np.array([
[
[5, 10, 12, 6],
[5.1, 8.2, 11, 6.3]
],
[
[6, 10, 12, 6],
[5.1, 8.2, 11, 6.3]
]
])
print("总维度:",cars.ndim)
print("场地 1 数据:\n", cars[0], "\n场地 1 维度:", cars[0].ndim)
print("场地 2 数据:\n", cars[1], "\n场地 2 维度:", cars[1].ndim)
2.2.2 添加数据
- np.concatenate([array1,array2]) 将两个数组合并成一维数组
- np.concatenate([array1,array2], axis =0 ) 在第一个维度(x)上叠加(默认)
- np.concatenate([array1,array2], axis =1 ) 在第二个维度(y)上叠加
前提要求数据维度对齐,此函数不改变数组维度
##一维数组->一维数组
cars1 = np.array([5, 10, 12, 6])
cars2 = np.array([5.2, 4.2])
cars = np.concatenate([cars1, cars2])
print(cars)
#[ 5. 10. 12. 6. 5.2 4.2]
##一维数组->二维数组->二维数组
test1 = np.array([5, 10, 12, 6])
test2 = np.array([5.1, 8.2, 11, 6.3])
# 首先需要把它们都变成二维,下面这两种方法都可以加维度
test1 = np.expand_dims(test1, 0)
test2 = test2[np.newaxis, :]
print("test1加维度后 ", test1)
print("test2加维度后 ", test2)
# 然后再在第一个维度上叠加
all_tests = np.concatenate([test1, test2])
print("括展后\n", all_tests)
- np.expand_dims(array1, 0) array[np.newaxis, :] 数组升维
a = np.array([
[1,2,3],
[4,5,6]
])
b = np.array([
[7,8],
[9,10]
])
print(np.concatenate([a,b], axis=1)) # 这个没问题
# print(np.concatenate([a,b], axis=0)) # 这个会报错
- np.vstack([array1, array2]) 竖向合并数据
- np.hstack([array1, array2]) 横向合并数据
a = np.array([
[1,2],
[3,4]
])
b = np.array([
[5,6],
[7,8]
])
print("竖直合并\n", np.vstack([a, b])) #第一维度
print("水平合并\n", np.hstack([a, b])) #第二维度
2.2.3 观察形态
- array1.shape 数组维数(仅包含有数据位置)
print("第一个维度:", cars.shape[0]) #第一个维度的元素个数 3
print("第二个维度:", cars.shape[1]) #第二个维度的元素个数 4
print("所有维度:", cars.shape) #(3,4)
2.3 数据选择
- 单个选取
array[1]
array[1,2,3]
array[1][1]
- 切片划分
array[:3]
array[2:4(x), 1:3(y)]
- 条件筛选
array[array<0]
np.where(array, array < 0)
2.3.1 单个数据的选择
a = np.array([1, 2, 3])
print("a[0]:", a[0]) #1
print("a[1]:", a[1]) #2
print("a[[0,1]]:\n", a[[0,1]]) #[1,2]
print("a[[1,1,0]]:\n", a[[1,1,0]]) #[2,2,1]
b = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
])
# 选第 2 行所有数
print("b[1]:\n", b[1]) #[5,6,7,8]
# 选第 2 行,第 1 列的数
print("b[1,0]:\n", b[1,0]) #5
# 这个看着有点纠结,如果对应到数据,
# 第一个拿的是数据位是 [1,2]
# 第二个拿的是 [0,3]
print("b[[1,0](x),[2,3](y)]:\n",
b[[1,0],
[2,3]]) #[7,4]
2.3.2 切片划分(批量取数)
左闭右开
a = np.array([1, 2, 3])
print("a[0:2]:\n", a[0:2]) #[1,2]
print("a[1:]:\n", a[1:]) #[2,3]
print("a[-2:]:\n", a[-2:]) #[2,3]
b = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
])
print("b[:2]:\n", b[:2]) # [[1,2,3,4],
#[5,6,7,8]]
print("b[:2(x), :3(y)]:\n", b[:2, :3]) #[[1,2,3],
#[5,6,7]]
print("b[1:3(x), -2:(y)]:\n", b[1:3, -2:]) #[[7,8],
# [11,12]]
2.3.3 条件筛选
-
按位置选
-
按数条件选 array1[array1>0] array[逻辑判断]
-
np.where(condition,array1(true), array2(false)) 满足条件数为array1的数,不满足条件为array2的数
a = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
])
condition = a > 7
b = -a - 1
print(np.where(condition, a, b))
##
[[-2 -3 -4 -5]
[-6 -7 -8 8]
[ 9 10 11 12]]
2.4 基础运算
- 加减乘除
+-*/
np.dot()
- 数据统计分析
np.max() np.min() np.sum() np.prod() np.count()
np.std() np.mean() np.median()
- 特殊运算符号
np.argmax() np.argmin()
np.ceil() np.floor() np.clip()
加减乘除 | (可实现数点加减乘除的效果) |
---|---|
加减乘除 | array1 ±*/ 8 |
矩阵乘法 | array1.dot(array2) np.dot(array1, array2) A*B |
矩阵外积 | np.outer(array1, array2)=A_ji*B |
矩阵内积 | np.inner(array1, array2)= A*(B^T) |
数据分析 | |
---|---|
最大最小值 | array1.max() np.max(array1); array1.min() np.min(array1) |
累加 | array1.sum() |
累乘 | array1.prod() |
元素个数 | array1.size() |
非零个数 | np.count_nonzero(array1) |
平均数 | np.mean(array1) |
中位数 | np.median(array1) |
标准差 | np.std(array1) |
特殊运算符号 | |
---|---|
最大/小值索引 | np.argmax(array1) np.argmin(array1) |
向上取整 | np.ceil(array1) |
向下取整 | np.floor(array1) |
上下界截取 | array1.clip(down,up) |
2.5 改变数据形态
- 改变形态
array[np.newaxis, :]
array.reshape()
array.ravel(), array.flatten()
array.transpose()
- 合并
np.column_stack(), np.row_stack()
np.vstack(), np.hstack(), np.stack()
np.concatenate()
- 拆解
np.vsplit(), np.hsplit(), np.split()
array1 = np.array([1,2,3,4,5,6])
改变形态 | 维数变化 | |
---|---|---|
增加维度 | array1[np.newaxis, :] | (m,-)->(1,m) |
a[:, None] | (m,-)->(m,1) | |
np.expand_dims(a, axis=0) | (m,-)->(1,m) | |
np.expand_dims(a, axis=1) | (m,-)->(m,1) | |
减少维度(只减少shape=1的维度) | np.squeeze(array1_expand) array1_expand.squeeze(axis=1) | (m,1)->(m,-) |
矩阵重塑 | array1.reshape([m,n])(支持三维) | (m*n,-)->(m,n) |
矩阵转置 | array1.T np.tranapose(array1) | (m,n) -> (n,m) |
a1 shape: (2, 3)
[[1 2 3]
[4 5 6]]
a2 shape: (3, 1, 2)
[[[1 2]] #最里面的数据是最后一维的!!!!!!
[[3 4]]
[[5 6]]]
合并 | 维数变化 | |
---|---|---|
数组以行为单位合并 | np.row_stack([array1, attay2]) | 2***(m,-)**->(2,m) |
数组对应位置合并(以列为单位) | np.column_stack([array1, attay2]) | 2*(m,-)->(m,2) |
数组以行(第一维度)为单位合并(维度必须正确) | np.vstack([array1, attay2]) | 2***(1,m)**->(2,m) |
数组以列(第二维度)为单位合并 (维度必须正确) | np.hstack([array1, attay2]) | 2*(m,1)->(m,2) |
矩阵以第一维度合并 | print(np.concatenate([array1, attay2], axis=0)) | 2*(2,2)->(4,2) |
矩阵以第二维度合并 | print(np.concatenate([array1, attay2], axis=1)) | 2*(2,2)->(2,4) |
拆解 | 维数变化 | |
---|---|---|
从第一维度分(横切) | np.vsplit(array1, indices_or_sections=2) # 分成两段 np.vsplit(array1, indices_or_sections=[2,3]) # 分片成 [:2],[2:3], [3:] | (m,n)->2*(m/2,n) |
从第二维度分(纵切) | np.hsplit(array1, indices_or_sections=2) # 分成两段 np.hsplit(array1, indices_or_sections=[2,3]) # 分片成 [:2],[2:3], [3:] | (m,n)->2*(m,n/2) |
按维度自定义切分 | np.split(a, indices_or_sections=2, axis=0) # 第一维度,分成两段 np.split(a, indices_or_sections=[2,3], axis=1) # 在第二维度,分片成 [:2],[2:3],[3:] |
3 经验式操作
①使用列表存储二维表的表头,便于索引。如下面的 covid[“header”]存储的是全部表头,通过.index(“”)可找到对应表头的索引。
confirm_idx = covid["header"].index("Confirmed")
covid = {
"date": [],
"data": [],
"header": [h for h in data[0].strip().split(",")[1:]]
}
for row in data[1:]:
split_row = row.strip().split(",")
covid["date"].append(split_row[0])
covid["data"].append([float(n) for n in split_row[1:]])
4 举例: 数据清洗
常见的脏数据类型:
- 数据值缺失 None=np.nan(np.float)->其他数据的平均值替代
- 数据值异常大或小
- 数据格式不统一
- 非独立数据错误
注意:data.dtype=object
描述的是数据类型,这种数据类型是无法参与Numpy运算的,只有 dtype
为 int
,float
这样的数值形式,才能参与运算。