01 数据分析-NumPy
数据分析-NumPy
1. 创建数组
- 利用array函数创建数组
- np.array([[3, 4, 5], [4, 2, 1]])
- 利用arange函数创建数组
- np.arange(0, 1, 0.1)
- 利用linspace函数创建数组(等差数列)
- np.linspace(0, 1, 11, endpoint=False)
- 利用logspace函数创建数组(等比数列)
- np.logspace(0, 4, 5, base=2) 底数
- 利用zeros函数创建数组
- np.zeros([3, 4, 5])
- 利用random函数创建随机数组
- np.random.random(10) 随机
- np.random.rand(3, 4) 均匀分布
- np.random.randn(2, 2, 3) 正态分布
import numpy as np
arr1 = np.array([0.3, 0.5, 4.2]) # 创建一维数组
arr2 = np.array([[3, 4, 5], [4, 2, 1]]) # 创建二维数组
arr3 = np.arange(0, 10)
arr4 = np.arange(10)
arr5 = np.arange(0, 1, 0.1) # 0开始,1结束,步长0.1
arr6 = np.linspace(0, 1, 11) # 0开始,1结束,11个元素
arr7 = np.zeros([3, 4, 5]) # 包含 三个四行五列的矩阵
print(np.random.random(10)) # 无约束条件下的随机数 随机的一维数组
print(np.random.rand(3, 4)) # 生成指定shape的均匀分布随机数 随机的三行四列
print(np.random.randn(2, 2, 3)) # 生成指定shape的正态分布随机数 一个包含两个二维三列数组的数组
print(type(arr1)) # <class 'numpy.ndarray'>
1.1 数组和列表的区别
# 初识数组的特点
list1 = [0.3, 0.5, 4.2]
arr1 = np.array([0.3, 0.5, 4.2])
# 数组的向量化运算能力
# list1 ** 2 # 非法操作
print([i**2 for i in list1]) # [0.09, 0.25, 17.64] <class 'list'>
print(arr1 ** 2) # [ 0.09 0.25 17.64] <class 'numpy.ndarray'>
1.2 查看数值的基本属性
print(arr1.shape) # (3,)
print(arr1.ndim) # 1 维度
print(arr1.dtype) # float64
1.3 数组类型
arr8 = np.array([3, 4, 5], dtype=np.float32) # 在创建数组时,声明其数据类型 [3. 4. 5.]
arr8[0] = 1.2 # 可以直接修改值 [1.2 4. 5. ]
print(np.int32(arr8)) # 转换数组的数据类型
注意
: np.int32(arr8)可以将原有的数据类型进行一个转化
2. 数组相关操作(索引,增删改查)
2.1 数组的索引
# 数组的索引
arr1 = np.array([0.3, 0.78, 0.24, 5, 3.2])
print(arr1)
# 一维数组的单个元素的索引
print(arr1[0])
print(arr1[-5])
# 一维数组的多个元素的索引(切片)
print(arr1[1:3]) # 左闭右开 [0.78 0.24]
print(arr1[-4:-2]) # 左开又闭 [0.78 0.24]
res1 = arr1[3]
res2 = arr1[3:4]
print(res1, res1.shape, type(res1)) # 5.0 () <class 'numpy.float64'> 单独取一个值的类型
print(res2, res2.shape)
2.2 逻辑型索引
arr2 = np.array([2.3, 1.8, 4.5])
print(arr2)
print(arr2[[False, True, True]]) # [1.8 4.5]
index = arr2 > 2
print(index) # [ True False True]
print(arr2[index]) # [2.3 4.5]
2.3 多维数据的索引
# 多维数组的索引
arr3 = np.arange(1, 13).reshape([3, 4])
print(arr3)
print(arr3[2, 3])
print(arr3[2, 0:]) # [ 9 10 11 12 ]
print(arr3[:, 0])
print(arr3[1:3, 1:3])
print(arr3[2:, :]) # 注意返回值的shape [[ 9 10 11 12]] 这是一个二位数组
print(arr3[arr3[:, 0] > 4, :]) # 二维数组的逻辑型索引 [[ 5 6 7 8][ 9 10 11 12]]
注意
: 有两:的返回结果是二维数组
2.4 求解距离矩阵
# 求解距离矩阵
n = 100 # 样本个数
x = np.linspace(1, 100, n) # 样本的横坐标
y = np.linspace(1, 100, n) # 样本的纵坐标
dist = np.zeros([n, n]) # 初始距离矩阵
for i in range(n):
for j in range(n):
dist[i, j] = np.sqrt((x[i] - x[j])**2 + (y[i] - y[j])**2) # 计算欧式距离
print(x)
print(y)
print(dist)
2.5 数组形态变化
# 数组形态变化
arr4 = np.arange(1, 13)
# print(arr4)
# print(arr4.reshape([3, 4])) # 改变数组的shape
# print(arr4.reshape([4, 3]))
arr5 = arr4.reshape([3, 4]) # 生成二维数组
# print(arr5)
# print(arr5.ravel()) # 数组展平
# print(arr5.flatten()) # 数组展平(横向)
# arr5.flatten("F") 纵向展平
arr6 = arr4.reshape([3, 4])
print(arr6)
print(np.vstack([arr5, arr6])) # arr5, arr6纵向组合
print(np.hstack((arr5, arr6))) # 横向组合
2.6 切割数组
arr = np.concatenate((arr1, arr2), axis=0) # 纵向合并
np.split(arr, 2, axis=1) # 横向切割, 切割后可按索引取值,切割成两个数组。
3. NumPy矩阵与通用函数
3.1 <class 'numpy.matrix'>
matr1 = np.mat("1 2 3;4 5 6;7 8 9")
print(matr1)
print(type(matr1))
matr2 = np.matrix([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
print(matr2)
print(type(matr2))
print(np.bmat('matr1 matr2; matr1, matr2')) # 矩阵拼接
print(matr1.T) # 矩阵的转置
print(matr1.I) # 矩阵的逆
3.2 通用函数
# 通用函数
arr1 = np.array([0.2, 0.4, 0.6])
arr2 = np.array([0.2, 0.6, 0.78])
list1 = [0.2, 0.4, 0.6]
print(arr1 + 1)
# print(list1 + 1) # 非法操作
print(arr1 * 2) # [0.4 0.8 1.2]
print(list1 * 2) # 注意其返回结果 [0.2, 0.4, 0.6, 0.2, 0.4, 0.6]
print(arr1 + arr2) # 对应元素相加
print(arr1 * arr2) # 对应元素相乘
print(arr1 > 0)
print(arr1 < arr2)
print(np.any(arr1 == 0.2)) # 逻辑 or 存在即为true
print(np.all(arr1 == 0.2)) # 逻辑 and
3.3 广播机制
# 广播机制
arr3 = np.arange(1, 13).reshape([4, 3])
arr4 = np.array([1, 2, 3])
arr5 = np.array([[1], [2], [3], [4]])
print(arr3)
print(arr4)
print(arr5)
print(arr3 + arr4)
print(arr3 + arr5)
4. NumPy进行统计分析
import numpy as np
# 读写二进制文件
arr1 = np.arange(1, 13).reshape([4, 3])
arr2 = np.arange(1, 13).reshape([3, 4])
# print(arr1)
# print(arr2)
np.save('../tmp/arr1.npy', arr1) # 保存数据
arr1_load = np.load('../tmp/arr1.npy') # 读取数据
print(arr1_load)
np.savez('../tmp/arr1&2.npz', arr1, arr2) # 保存多个数组数据
arr1_2_load = np.load('../tmp/arr1&2.npz')
print(arr1_2_load) # <numpy.lib.npyio.NpzFile object at 0x000002B2531BC780>
print(arr1_2_load.files) # 查看数据文件中有哪些数组对象
print(arr1_2_load['arr_0']) # 访问数据文件中的具体数组对象
print(arr1_2_load['arr_1'])
# 读写txt文件
np.savetxt('../tmp/arr1.txt', arr1, delimiter=',') # 保存数据
np.loadtxt('../tmp/arr1.txt', delimiter=',') # 读取数据
# 使用数组进行简单统计分析
arr3 = np.random.randint(1, 10, (3, 4))
print(arr3)
arr3.sort(axis=0) # 对数组元素按大小进行排序 0列,1行
# print(arr3)
# print(arr3.argsort(axis=0)) # 返回排序后的下标
print(np.tile(arr3, 2)) # 对数组进行复制操作
print(np.repeat(arr3, 2, axis=1)) # 对数组元素进行复制
print(np.repeat(arr3, 2, axis=0))
print(arr3.mean()) # 统计数组所有元素的均值
print(arr3.mean(axis=0)) # 按列统计数组的均值
print(arr3.max(axis=0))
print(arr3.argmax(axis=0)) # 找出每列元素最大值的位置
再坚持一下下,会越来越优秀