'''
Numpy基础数据结构
NumPy数组是一个多维数组对象,称为ndarray。其由两部分组成:
① 实际的数据
② 描述这些数据的元数据
'''
import numpy as np
import time
ar = np.array([1,2,3,4,5,6,7])
print(ar)
print(ar.ndim)
print(ar.shape)
print(ar.size)
print(ar.dtype)
print(ar.itemsize)
print(ar.data)
print("==============创建数组===================")
ar1 = np.array(range(10))
ar2 = np.array([1,2,3.14,4,5,"hello"])
ar3 = np.array([[1,2,3],('a','b','c')])
ar4 = np.array([[1,2,3],('a','b','c','d')])
print(ar1,type(ar1),ar1.dtype)
print(ar2,type(ar2),ar2.dtype)
print(ar3,ar3.shape,ar3.ndim,ar3.size)
print(ar4,ar4.shape,ar4.ndim,ar4.size)
print("=======================arange()用法========================")
print(np.arange(10))
print(np.arange(10.0))
print(np.arange(5,12))
print(np.arange(5.0,12,2))
print(np.arange(10000))
print("===============linspace()用法=================")
ar1 = np.linspace(2.0, 3.0, num=5)
ar2 = np.linspace(2.0, 3.0, num=5, endpoint=False)
ar3 = np.linspace(2.0, 3.0, num=5, retstep=True)
print(ar1,type(ar1))
print(ar2)
print(ar3,type(ar3))
print("==============zeros()/zeros_like()/ones()/ones_like()用法=================")
ar1 = np.zeros(5)
ar2 = np.zeros((2,2), dtype = np.int)
print(ar1,ar1.dtype)
print(ar2,ar2.dtype)
print('-------------------------------------')
ar3 = np.array([list(range(5)),list(range(5,10))])
ar4 = np.zeros_like(ar3)
print(ar3)
print(ar4)
print('---------------------------------------')
ar5 = np.ones(9)
ar6 = np.ones((2,3,4))
ar7 = np.ones_like(ar3)
print(ar5)
print(ar6)
print(ar7)
print("========eye()用法==============")
print(np.eye(5))
print(np.eye(5).shape)
'''
ndarray的数据类型
bool 用一个字节存储的布尔类型(True或False)
intX 由所在平台决定其大小的整数(一般为int32或int64)
int8 一个字节大小,-128 至 127
int16 整数,-32768 至 32767
int32 整数,-2 ** 31 至 2 ** 32 -1
int64 整数,-2 ** 63 至 2 ** 63 - 1
uint8 无符号整数,0 至 255
uint16 无符号整数,0 至 65535
uint32 无符号整数,0 至 2 ** 32 - 1
uint64 无符号整数,0 至 2 ** 64 - 1
float16 半精度浮点数:16位,正负号1位,指数5位,精度10位
float32 单精度浮点数:32位,正负号1位,指数8位,精度23位
float64或float 双精度浮点数:64位,正负号1位,指数11位,精度52位
complex64 复数,分别用两个32位浮点数表示实部和虚部
complex128或complex 复数,分别用两个64位浮点数表示实部和虚部
######## 本节课有作业,请查看 “课程作业.docx” ########
'''
'''
Numpy通用函数
基本操作
'''
print("=============.T/.reshape()/.resize()=================")
ar1 = np.arange(10)
ar2 = np.ones((5,2))
print(ar1,'\n',ar1.T)
print(ar2,'\n',ar2.T)
print('------')
print("-------------------------------------------")
ar3 = ar1.reshape(2,5)
ar4 = np.zeros((4,6)).reshape(3,8)
ar5 = np.reshape(np.arange(12),(3,4))
print(ar1,'\n',ar3)
print(ar4)
print(ar5)
print('-------------------------------------------')
print(np.arange(5))
ar6 = np.resize(np.arange(5),(3,4))
print(ar6)
print("==============shu数组复制===================")
ar1 = np.arange(10)
ar2 = ar1
print(ar2 is ar1)
ar1[2] = 9
print(ar1,ar2)
ar3 = ar1.copy()
print(ar3 is ar1)
ar1[0] = 9
print(ar1,ar3)
print("===========.astype()用法===============")
ar1 = np.arange(10,dtype=float)
print(ar1,ar1.dtype)
print('---------------------------------------')
ar2 = ar1.astype(np.int32)
print(ar2,ar2.dtype)
print(ar1,ar1.dtype)
print("=================数组堆叠=================")
ar1 = np.array(range(10))
a = np.arange(5)
b = np.arange(5,9)
ar1 = np.hstack((a,b))
print(a,a.shape)
print(b,b.shape)
print(ar1,ar1.shape)
print("----------------------------------------")
a = np.array([[1],[2],[3]])
b = np.array([['a'],['b'],['c']])
ar2 = np.hstack((a,b))
print(a,a.shape,a.ndim)
print(b,b.shape,b.ndim)
print(ar2,ar2.shape)
print('-----------------------------------------')
a = np.arange(5)
b = np.arange(5,10)
ar1 = np.vstack((a,b))
print(a,a.shape)
print(b,b.shape)
print(ar1,ar1.shape)
a = np.array([[1],[2],[3]])
b = np.array([['a'],['b'],['c'],['d']])
ar2 = np.vstack((a,b))
print(a,a.shape)
print(b,b.shape)
print(ar2,ar2.shape)
print('-------------------------------------')
a = np.arange(5)
b = np.arange(5,10)
ar1 = np.stack((a,b))
ar2 = np.stack((a,b),axis = 1)
print(a,a.shape)
print(b,b.shape)
print(ar1,ar1.shape)
print(ar2,ar2.shape)
print("============数组拆分==============")
ar = np.arange(16).reshape(4,4)
ar1 = np.hsplit(ar,2)
print(ar)
print(ar1,type(ar1))
ar2 = np.vsplit(ar,4)
print(ar2,type(ar2))
print("===========数组简单运算===============")
ar = np.arange(6).reshape(2,3)
print(ar + 10)
print(ar * 2)
print(1 / (ar+1))
print(ar ** 0.5)
print(ar.mean())
print(ar.max())
print(ar.min())
print(ar.std())
print(ar.var())
print(ar.sum(), np.sum(ar,axis = 0))
print(np.sort(np.array([1,4,3,2,5,6])))
print("===================Numpy索引以及切片=================")
'''
Numpy索引及切片
核心:基本索引及切片 / 布尔型索引及切片
'''
ar = np.arange(20)
print(ar)
print(ar[4])
print(ar[3:6])
print('---------------------------------------')
ar = np.arange(16).reshape(4,4)
print(ar, '数组轴数为%i' %ar.ndim)
print(ar[2], '数组轴数为%i' %ar[2].ndim)
print(ar[2][1])
print(ar[1:3], '数组轴数为%i' %ar[1:3].ndim)
print(ar[2,2])
print(ar[:2,1:])
print('-----------------------------------------------')
ar = np.arange(8).reshape(2,2,2)
print(ar, '数组轴数为%i' %ar.ndim)
print(ar[0], '数组轴数为%i' %ar[0].ndim)
print(ar[0][0], '数组轴数为%i' %ar[0][0].ndim)
print(ar[0][0][1], '数组轴数为%i' %ar[0][0][1].ndim)
print("===========尔型索引及切片=============")
ar = np.arange(12).reshape(3,4)
i = np.array([True,False,True])
j = np.array([True,True,False,False])
print(ar)
print(i)
print(j)
print(ar[i,:],"=====")
print(ar[:,j],"*****")
m = ar > 5
print(m)
print(ar[m])
print("======数组索引及切片的值更改、复制=======")
ar = np.arange(10)
print(ar)
ar[5] = 100
ar[7:9] = 200
print(ar)
ar = np.arange(10)
b = ar.copy()
b[7:9] = 200
print(ar)
print(b)
print("==============Numpy随机数==============")
'''
Numpy随机数
numpy.random包含多种概率分布的随机样本,是数据分析辅助的重点工具之一
'''
samples = np.random.normal(size=(4,4))
print(samples)
import matplotlib.pyplot as plt
a = np.random.rand()
print(a,type(a))
b = np.random.rand(4)
print(b,type(b))
c = np.random.rand(2,3)
print(c,type(c))
samples1 = np.random.rand(1000)
samples2 = np.random.rand(1000)
plt.scatter(samples1,samples2)
print("------------------------------")
samples1 = np.random.randn(1000)
samples2 = np.random.randn(1000)
plt.scatter(samples1,samples2)
print("-------------------------")
print(np.random.randint(2))
print(np.random.randint(2,size=5))
print(np.random.randint(2,6,size=5))
print(np.random.randint(2,size=(2,3)))
print(np.random.randint(2,6,(2,3)))
print("===========Numpy数据的输入输出==============")
'''
Numpy数据的输入输出
numpy读取/写入数组数据、文本数据
'''
import os
os.chdir(r'C:\Users\cf\Desktop')
ar = np.random.rand(5,5)
print(ar)
print(np.eye(3))
print(np.diag([1,2,3,4]))
print(np.float(42))
print(np.int32(42.0))
print(np.bool(42))
print(np.bool(0))
print(np.float(True))
print(np.float(False))
ar = np.arange(12).reshape(3,4)
print(ar)
print(ar.ravel())
print(ar.flatten())
print(ar.flatten('F'))
print("--------------------------------")
ar1 = np.arange(12).reshape(3,4)
print(ar1)
ar2 = ar1*3
print(ar2)
print(np.concatenate((ar1, ar2), axis = 1))
print(np.concatenate((ar1, ar2), axis = 0))
print("------------------------------------")
ar = np.arange(16).reshape(4,4)
print(ar)
print(np.hsplit(ar, 2))
print(np.vsplit(ar, 2))
print(np.split(ar, 2, axis=1))
print(np.split(ar, 2, axis=0))
print("===============创建矩阵=======================")
matr1 = np.mat("1 2 3;4 5 6;7 8 9")
print(matr1)
matr2 = np.matrix([[1,2,3], [4,5,6],[7,8,9]])
print(matr2)
print("========bmat(分块矩阵)函数创建矩阵===========")
ar1 = np.eye(3)
print(ar1)
ar2 = ar1 * 3
print(ar2)
print(np.bmat('ar1 ar2; ar1 ar2'))
print("================矩阵运算===============")
mat1 = np.mat("1 2 3;4 5 6;7 8 9")
print(mat1)
mat2 = mat1 * 3
print(mat2)
print(mat1 + mat2)
print(mat1 - mat2)
print(mat1*mat2)
print(np.multiply(matr1, mat2))
print(mat1)
print(mat1.T)
print(mat1.H)
print(mat1.I)
print("==================广播=================")
ar1 = np.arange(2).reshape(2,1)
ar2 = np.arange(96).reshape(8,4,3)
print(ar1,ar1.shape,ar1.ndim)
print(ar2,ar2.shape,ar2.ndim)
print(ar1 + ar2,'---------------------')