#数学基础回顾之矩阵运算
#基本概念
#矩阵:矩形的数组,即二维数组。其中向量和标量都是矩阵的特例
#向量:是指1*n或者n*1的矩阵
#标量:1*1的矩阵
#数组:N维的数组,是矩阵的延伸
#特殊矩阵:
#全0全1矩阵
#单位矩阵
#矩阵加减运算:
#相加,减的两个矩阵必须要有相同的行和列
#行和列对应元素相加减
#数组乘法(点乘)
#数组乘法(点乘)是对应元素之间的乘法
#矩阵乘法:
#设A为m*p的矩阵,B为p*n的矩阵,m*n的矩阵为C为A*B的乘积,即为C=AB
# [a1 b1 * [c1 d1] [a1*c1+b1*c2 a1*d1+b1*d2
# a2 b2 ] c2 d2 ] = a2*c1+b2*c2 a2*d1+b2*d2]
#数组的创建和访问
import numpy as np
# a = np.array([1,2,3,4])
# print(a) #[1 2 3 4] 一维数组
# b = np.array([[1,2,3,4],[5,6,7,8]])
# print(b) #[[1 2 3 4][5 6 7 8]] #二维数组
# print(b.shape)#(2, 4) 二维4列
# print(b.size) #8 数组元素个数
# print(b.dtype) #int32 元素类型
# array_3 = np.array([[1.0,2,3],[4.0,5,6]])
# print(array_3.dtype) #float64 会统一为一种数据类型
# array_4 = np.arange(1,10,2)
# print(array_4) #[1 3 5 7 9]
# print(np.zeros(5)) #[0. 0. 0. 0. 0.]
#print(np.zeros([2,3])) #两行三列
# [[0. 0. 0.]
# [0. 0. 0.]]
#print(np.eye(5)) #生成单位矩阵
# [[1. 0. 0. 0. 0.]
# [0. 1. 0. 0. 0.]
# [0. 0. 1. 0. 0.]
# [0. 0. 0. 1. 0.]
# [0. 0. 0. 0. 1.]]
# a = np.arange(1,10)
# print(a) #[1 2 3 4 5 6 7 8 9]
# print(a[1]) #2
# print(a[1:5]) #[2 3 4 5]
# b = np.array([[1,2,3],[4,5,6]])
# print(b)
# # [[1 2 3]
# # [4 5 6]]
# print(b[1][0]) #4 或者
# print(b[1,0]) #4
# c = np.array([[1,2,3],[4,5,6],[7,8,9]])
# print(c)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
#print(c[:2,1:])
# [[2 3]
# [5 6]]
#数组和矩阵的运算
#快速创建数组
# a = np.random.randn(10)
# print(a) #正态分布的数组
# [ 0.102982 -0.42399255 -0.02220043 0.50845286 -0.72317458 1.875959460.68178584 -1.84984881 -0.77927156 0.55651919]
# b = np.random.randint(10)
# print(b)#4 随机生成一个小于10的整数
# b = np.random.randint(10,size=20)
# print(b) #[8 0 9 5 9 2 0 3 1 8 4 3 3 3 2 8 4 9 7 3] #生成20个元素的随机数组
# b = np.random.randint(10,size=20).reshape([4,5])
# print(b)
# [[5 7 0 0 4]
# [6 9 2 4 4]
# [4 4 4 7 0]
# [0 1 8 9 3]]
#数组的运算:对应元素的相乘加减等等
# a = np.random.randint(10,size=20).reshape([4,5])
# print(a)
# b = np.random.randint(10,size=20).reshape([4,5])
# print(b)
# print(a+b)
# [[0 4 3 1 8]
# [9 2 4 5 0]
# [5 6 9 1 5]
# [5 1 4 1 3]]
# [[8 1 2 0 1]
# [1 3 4 5 2]
# [5 9 4 7 6]
# [2 5 2 5 9]]
# [[ 8 5 5 1 9]
# [10 5 8 10 2]
# [10 15 13 8 11]
# [ 7 6 6 6 12]]
#矩阵
#生成矩阵
# a = np.mat([[1,2,3],[4,5,6]])
# print(a)
# [[1 2 3]
# [4 5 6]]
#数组与矩阵装换
# a = np.random.randint(10,size=20).reshape([4,5])
# print(a)
# [[2 0 9 1 0]
# [5 2 1 6 7]
# [3 5 3 3 9]
# [7 8 6 3 1]]
# print(np.mat(a))#是矩阵matrix类型
# [[2 0 9 1 0]
# [5 2 1 6 7]
# [3 5 3 3 9]
# [7 8 6 3 1]]
#矩阵的运算
# a = np.random.randint(10,size=20).reshape([4,5])
# A = np.mat(a)
# b = np.random.randint(10,size=20).reshape([4,5])
# B = np.mat(b)
# print(A)
# print(B)
# print(A+B) #对应位置相加
# print(A-B) #对应位置相减
# # [[8 0 3 7 6]
# # [5 6 0 0 2]
# # [5 3 9 8 8]
# # [9 6 2 3 0]]
# # [[9 9 2 3 1]
# # [7 3 8 9 1]
# # [2 8 9 9 3]
# # [5 1 6 7 5]]
# # [[17 9 5 10 7]
# # [12 9 8 9 3]
# # [ 7 11 18 17 11]
# # [14 7 8 10 5]]
# # [[-1 -9 1 4 5]
# # [-2 3 -8 -9 1]
# # [ 3 -5 0 -1 5]
# # [ 4 5 -4 -4 -5]]
# print(A*B) #会报错,矩阵运算A矩阵的行数需要等于B矩阵的列数
# a = np.mat(np.random.randint(10,size=20).reshape([4,5]))
# b = np.mat(np.random.randint(10,size=20).reshape([5,4]))
# print(a)
# print(b)
# print(a*b)
# [[7 1 8 8 8]
# [2 7 2 1 6]
# [6 6 4 0 8]
# [3 3 6 1 0]]
# [[3 9 0 5]
# [5 9 4 3]
# [1 0 1 4]
# [8 3 0 4]
# [0 5 4 5]]
# [[ 98 136 44 142]
# [ 51 114 54 73]
# [ 52 148 60 104]
# [ 38 57 18 52]]
#Array常见函数
# a = np.random.randint(10,size=20).reshape([4,5])
# print(a)
# # [[4 0 5 7 5]
# # [3 3 6 5 1]
# # [8 1 2 5 1]
# # [7 6 5 5 6]]
# print(np.unique(a)) #[0 1 2 3 5 6 7 8 9] 返回唯一的元素
# print(sum(a)) #[13 11 21 19 21] 返回列的和
# print(sum(a[0])) #24 返回行的和
# print(sum(a[:,1])) #24 返回某一列的和
#
# print(max(a)) #返回最大元素
# print(max(a[0])) #返回某行最大元素
# print(max(a[:,1]))#返回某列最大元素
#array的input和output
#使用pickle序列化numpy array
import pickle
# x = np.arange(10)
# print(x)
# f = open("x.pkl","wb")
# pickle.dump(x,f) #将x pickle到硬盘上去产生的文件
#读取硬盘数据
# f = open("x.pkl","rb")
# print(pickle.load(f)) #[0 1 2 3 4 5 6 7 8 9]
# x = np.arange(10)
# np.save("one_array",x)#直接将数组序列化到硬盘中
# #读取数据
# print(np.load("one_array.npy")) #[0 1 2 3 4 5 6 7 8 9]
# x = np.arange(10)
# y = np.arange(20)
# np.savez("two_array.npz",a=x,b=y)
# c = np.load("two_array.npz")
# print(c["a"]) #[0 1 2 3 4 5 6 7 8 9]
# print(c["b"]) #[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]