# 1关于numpy 的学习
import numpy as np
# 一 如何创建数组****
# 1 有规律的一维数据的创建======
# 1 range() 和arange() 区别 貌似没有区别
lst1 = range(10)
lst1 = list(lst1)
# print(lst1,type(lst1)) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
lst2 = np.arange(10)
lst2 = list(lst2)
# print(lst2,type(lst2)) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
# 2 利用array()函数创建无规律的一维数组 array 一维数组的创建(元素由元祖 或者列表) ======
arr1 = np.array((1,20,13,28,22))
arr2 = np.array([1,20,13,28,22])
# print("arr1",arr1,type(arr1)) #arr1 [ 1 20 13 28 22] <class 'numpy.ndarray'> ndarray:多维数组
# print("arr2",arr2,type(arr2)) #arr1 [ 1 20 13 28 22] <class 'numpy.ndarray'> ndarray:多维数组
# 3 二维数据的创建========
# array 二维数组的创建(元素由元祖套元祖 或者列表套列表) #大列表套小列表
arr4 = np.array(((1,2,3),(4,5,6),(7,8,9)))
# print("arr4=",arr4,type(arr4))
# arr4= [[1 2 3]
# [4 5 6]
# [7 8 9]] <class 'numpy.ndarray'>
arr5 = np.array([[1,2,3],[4,5,6],[7,8,9]])
# print("arr5=",arr5,type(arr5))
# arr5= [[1 2 3]
# [4 5 6]
# [7 8 9]] <class 'numpy.ndarray'>
# 4 特殊数组的创建
# 4-1 zeros 方式 不能嵌套
arr6 = np.zeros(5) #返回一维元素全为0的数组
# for i in arr6:
# print(i)
# print("arr6",arr6,type(arr6)) #arr6 [0. 0. 0. 0. 0.] <class 'numpy.ndarray'>
arr7 = np.zeros((2,5)) #返回一维元素全为0 的2x5 的二维数组
# for i in arr7:
# print(i)
# print("arr7",arr7,type(arr7))
# arr7 [[0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0.]] <class 'numpy.ndarray'>
arr8 = np.zeros([3,6]) #返回元素全为0 的 3x6的数据
# print("arr8",arr8,type(arr8)) #arr7 [[0. 0.]] <class 'numpy.ndarray'>
# arr8 [[0. 0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0. 0.]] <class 'numpy.ndarray'>
# 4-2 empty 的方式 个人感觉和zeros 有点相似
arr9 = np.empty(3) #返回一维空数组
# print("arr9=",arr9,type(arr9)) #arr9= [0. 0. 0.] <class 'numpy.ndarray'>
arr10 = np.empty([3,4]) # 返回3x4的二维空数组
# print("arr10",arr10,type(arr10))
# arr10 [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]] <class 'numpy.ndarray'>
# 二 有关数据的属性和函数****
# 1 shape 方法返回数组的行数 和列数
arr11 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr11 = arr11.shape #shape 方法返回数组的行数 和列数
#print(arr11) #(3, 3) #3行3列
# 2#dtype 方法返回数组的数据类型 int32
arr12 = np.array([[1,2,3],[4,5,6],[7,8,9]])
# arr12 = arr12.dtype #dtype 方法返回数组的数据类型 int32
#print(arr12)
# 3-1通过ravel的方法将数组拉直(多维数据降为一维数据)
arr13 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr13 = arr13.ravel()# 通过ravel的方法将数组拉直(多维数据降为一维数据)
# print(arr13) #[1 2 3 4 5 6 7 8 9]
# print(list(arr13)) #[1, 2, 3, 4, 5, 6, 7, 8, 9]
# 3-2通过flatten 的方法将数组拉直
arr14 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr14 = arr14.flatten()#通过flatten 的方法将数组拉直
# print(arr14) #[1 2 3 4 5 6 7 8 9]
# 注意:虽然ravel() 和flatten() 都是将数组拉直,
# 区别:1 racelI() 的方法生成的是原数组的视图,无需找有内存空间,但是数组的变化会影响到原数组的变化
# 2 flatten() 的方法返回的是真实的值 其值得改变并不会影响到原数组的变化
# 3-3 举例说明区别拉直是否改变原生数组 flatten不变 ravel 变化
arr15 = np.array([[1,2,3],[4,5,6],[7,8,9]])
_arr15 = arr15.flatten() #原数组不变
_arr15[:3] = 0
# print(arr15)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
arr16 = np.array([[1,2,3],[4,5,6],[7,8,9]])
_arr16 = arr16.ravel()# 原数组会随之变化
_arr16[0:3] = 0
# print(arr16)
# [[0 0 0]
# [4 5 6]
# [7 8 9]]
#4返回数组的维数ndim 自己的理解就是嵌套几层
arr17 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr17 = arr17.ndim
# print(arr17) #2
# 5 返回数组元素的个数 size
arr18 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr18 = arr18.size
# print(arr18) #9
# 6 返回数组的转置结果 类似zip类型(将原始的列,变成每行 )
arr19 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr19 = arr19.zip
# print(arr19)
# [[1 4 7]
# [2 5 8]
# [3 6 9]]
# 了解复数 z=a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位
# 7 如果数组的数据类型为复数的话,real方法可以返回复数的实部,imag 方法返回复数的虚部
# 返回数组有多少行,
# 8 长度参数 len()
arr20 = np.array([[1,2,3],[4,5,6],[7,8,9]])
l = len(arr20)
# print(l) #3
# 8 hstack()或者column_stack() 在列数一定情况下 横向拼接 在每一行后边就追加
arr21 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr22 = np.array([[10,20],[40,50],[70,80]])
# arr23 = np.hstack((arr21,arr22))
arr23 = np.column_stack((arr21,arr22)) #一样的效果
# print(arr23)
# [[ 1 2 3 10 20]
# [ 4 5 6 40 50]
# [ 7 8 9 70 80]]
# 9 vstack()或者row_stack() 在行数一定的情况下 纵向拼接
arr24 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr25 = np.array([[10,20,30],[40,50,60]])
arr26 = np.vstack((arr24,arr25))
# arr26 = np.row_stack((arr24,arr25))#拼接列 一样的效果
# print(arr26)
# [[ 1 2 3]
# [ 4 5 6]
# [ 7 8 9]
# [10 20 30]
# [40 50 60]]
# 10 reshape() 函数 将一维数组设置为二维数组,且3行6列
# resize() 函数可以重新设置数组的行数 和列数
arr27 = np.array(np.arange(18))
# print(arr27) #[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]
arr27 = arr27.reshape(3,6)
# print(arr27)
# [[ 0 1 2 3 4 5]
# [ 6 7 8 9 10 11]
# [12 13 14 15 16 17]]
# ???????? resize() 略 会直接改变元祖的形状
# 11 tolist 将数组转换成列表,astype() 强制转换成数组的数据类型,
arr28 = np.array([[1,2,3],[4,5,6],[7,8,9]])
_arr28 = arr28.tolist()
# print(arr28,_arr28)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr29 = arr28.astype(float)
# print(_arr28,"==",arr29,type(arr29))
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# ==
# [[1. 2. 3.]
# [4. 5. 6.]
# [7. 8. 9.]] <class 'numpy.ndarray'>
# 12 数组元素的获取==很重要
## 12-1 一维数组元素的获取与列表 通过切片取值 ,元祖的获取方式一样 ,通过索引和切片的方式获取数组元素,
arr30 = np.array(np.arange(10))
#print(arr30)
# print("取值第6个元素",arr30[5])# 5
# print("取值前3个元素",arr30[:3])# [0 1 2]
# print("取值第4个元素及之后的元素",arr30[4:]) #[4 5 6 7 8 9]
# print("取值最后的2元素",arr30[8:9]) #[8]
# print("取值从1开始步长为3的元素",arr30[::3]) #[0 3 6 9]
# 12-2 二维数组元素的获取
arr31 = np.array(np.arange(12).reshape(3,4)) #三行四列
# print(arr31)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# print("返回数组的第2行",arr31[1]) #返回数组的第2行 [4 5 6 7]
# print("返回数组的前2行",arr31[:2]) #返回数组的前2行 [[0 1 2 3][4 5 6 7]]
# print("返回数组的第1行和第3行",arr31[::2])
# print("返回数组的第1行和第3行",arr31[[0,2]])#注意里面套装两个[] 截取的是0 第一 和2 第3 行数据
# 返回数组的第1行和第3行 [[ 0 1 2 3]
# [ 8 9 10 11]]
# ==========关于列的返回值 不理解??????
# print("返回数组的第1列",arr31[:,0]) #返回数组的第1列 [0 4 8] #0 代表第一列
# print("返回数组的后2列",arr31[:,-2:]) # -2代表后2列=====????
# 返回数组的后2列
# [[ 2 3]
# [ 6 7]
# [10 11]]
# print("返回数组的第1列和第3列",arr31[:,[0,2]])
# 返回数组的第1列和第3列
# [[ 0 2]
# [ 4 6]
# [ 8 10]]
# print(arr31[1,2]) #返回的是第二行第三列的数据
# 6
# 12-3 布尔索引 即索引值为 True 和 Fales 需要注意的是布尔索引必须输数组对象。
# 1选出所有的True 对象
log = np.array([False,False,False,True,True,True])#此处相当于6行,必须和数组对应好行数
arr32 = np.array(np.arange(12).reshape(6,2)) #对比以上的6行,前三行是False 后三行是True 显示后三行
# print(arr32)
# print(arr32[log])
# [[ 6 7]
# [ 8 9]
# [10 11]]
# 2 选出所有的False 对象
# print(arr32[-log]) #?????? 出错了 不知道为什么出错?????????
# 场景示例 查询相关的行(以下注解:一共7行,过滤是A的数据)
area = np.array(["A","B","A","C","A","B","D"])
# print(area) #['A' 'B' 'A' 'C' 'A' 'B' 'D']
arr33 = np.array(np.arange(21).reshape(7,3))
# print(arr33)
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]
# [12 13 14]
# [15 16 17]
# [18 19 20]]
# print(arr33[area == "A"]) #一维数组 每个元素看成一行,元素A 的1 3 5 行
# [[ 0 1 2]
# [ 6 7 8]
# [12 13 14]]
# print(arr33[(area == "A") | (area == "C")]) #注意大小写 该是什么就是什么
# [[ 0 1 2]
# [ 6 7 8]
# [ 9 10 11]
# [12 13 14]]
# 布尔索引也可以与普通索引或切片混合使用
# 截取 A行 的第1列和第3 列
# print(arr33[area == 'A'][:,[0,2]]) #第1列和第3列
# [[ 0 2]
# [ 6 8]
# [12 14]]
# 花式索引 按照指定顺序返回对应的行
# print(arr33[[3,0,5]]) # 注意里面是个数组的形式 按照索引取值每行
# [[ 9 10 11]
# [ 0 1 2]
# [15 16 17]
# 花式索引 按照指定顺序返回对应的行过滤出的列
# print(arr33[[3,0,5]][:,[0,2]]) #按照以上得出的结果 再取列 第1列和第3列
# [[ 9 11]
# [ 0 2]
# [15 17]]
# 如果想使用比较简单的方式返回指定行以列的二维数组的话,可以使用ix_() 函数
a = arr33[np.ix_([3,0,5],[0,2])] #和以上 [[3,0,5]][:,[0,2]]) 一样的
# print(a)
# [[ 9 11]
# [ 0 2]
# [15 17]]
# 12-4 统计函数与线性代数运算
# 统计运算中常见的聚合函数有:最小值、最大值、中位数、均值、方差、标准差等。首先来看看数组元素级别的计算:
####=== 1 取值范围 数字——np
arr34 = 5-np.arange(1,13).reshape(4,3) #一共12个数字 从+4开始到-7 [-7:5]
# print(arr34)
# [[ 4 3 2]
# [ 1 0 -1]
# [-2 -3 -4]
# [-5 -6 -7]]
#### ===2 随机数 整数 random
arr35 = np.random.randint(1,10,size = 12).reshape(4,3)
# print(arr35)
# [[6 5 8]
# [8 6 1]
# [2 5 8]
# [6 7 3]]
#### ===3 计算每个元素的平方 **2
a = arr34 ** 2
# print(a)
# [[16 9 4]
# [ 1 0 1]
# [ 4 9 16]
# [25 36 49]]
#### ===4 计算每个元素的平方根 sqrt()
arr36 = np.arange(4,7).reshape(1,3)
# print(arr36)
# [[4 5 6]]
a = np.sqrt(arr36)
# print(a)
# [[2. 2.23606798 2.44948974]]
# 由于负值的平方根没有意义,故返回nan。
#### ===5 计算每个元素的自然对数值 log()
# print(np.log(arr36))
# [[1.38629436 1.60943791 1.79175947]]
#### ===6 计算每个元素的绝对值 abs()
arr37 = 5-np.arange(1,13).reshape(3,4)
# print(arr37)
# [[ 4 3 2 1]
# [ 0 -1 -2 -3]
# [-4 -5 -6 -7]]
arr38 = np.abs(arr37)
# print(arr38)
# [[4 3 2 1]
# [0 1 2 3]
# [4 5 6 7]]
# print(arr38.tolist()) #[[4, 3, 2, 1], [0, 1, 2, 3], [4, 5, 6, 7]]
# 7 相同形状数组之间元素的操作========
# 相同形状数组之间元素的操作 相加
# print(arr37 + arr38)
# [[8 6 4 2]
# [0 0 0 0]
# [0 0 0 0]]
# 相同形状数组之间元素的操作 相减
# print(arr37 - arr38)
# [[ 0 0 0 0]
# [ 0 -2 -4 -6]
# [ -8 -10 -12 -14]]
# 相同形状数组之间元素的操作 相乘
# print(arr37 * arr38)
# [[ 16 9 4 1]
# [ 0 -1 -4 -9]
# [-16 -25 -36 -49]]
# 相同形状数组之间元素的操作 相除
# print(arr38 / arr37)
# [[ 1. 1. 1. 1.]
# [nan -1. -1. -1.]
# [-1. -1. -1. -1.]]
# 相同形状数组之间元素的操作 整除
# print(arr38 // arr37)
# [[ 1 1 1 1]
# print(arr38 // arr37)
# [ 0 -1 -1 -1]
# [-1 -1 -1 -1]]
# 相同形状数组之间元素的操作 取余
# print(arr37 % arr38)
# [0 0 0 0]
# print(arr37 % arr38)
# [0 0 0 0]]
# ===== 12-5 统计运算函数
arr39 = 5-np.arange(1,13).reshape(3,4)
# print(arr39)
# [[ 4 3 2 1]
# [ 0 -1 -2 -3]
# [-4 -5 -6 -7]]
# 1计算所有元素的和 sum
# print(np.sum(arr39)) #-18
#2 对每一列求和
# print(np.sum(arr39,axis=0))
# [ 0 -3 -6 -9]
# 3 对每一行求和
# print(np.sum(arr39,axis=1))
# [ 10 -6 -22]
#4 对每一个元素求累计和(从上到下,从左到右)
# print(np.cumsum(arr39))
# [ 4 7 9 10 10 9 7 4 0 -5 -11 -18]
# 5 求每一列的累积和 返回个二维数组
# print(np.cumsum(arr39,axis=0))
# [[ 4 3 2 1]
# [ 4 2 0 -2]
# [ 0 -3 -6 -9]]
# 6 求每一行的累计和 返回个二维数组
# print(np.cumprod(arr39,axis=1))
# [[ 4 12 24 24]
# [ 0 0 0 0]
# [ -4 20 -120 840]]
# 7 计算所有元素的最小值
# print(np.min(arr39)) #-7
# 8 计算所有元素的最大值
# print(np.max(arr39))
# 9 计算每一列的最大值
# print(np.max(arr39,axis=0)) #
# [[ 4 3 2 1]
# 10计算所有元素的平均值
# print(np.mean(arr39)) #-1.5
# 11 计算每一行的均值
# print(np.mean(arr39,axis=1))
# #[ 2.5 -1.5 -5.5]
# 12 计算所有元素的中位数
# print(np.median(arr39)) #-1.5
# 13 计算每一列的中位数
# print(np.median(arr39,axis=0))
#[ 0. -1. -2. -3.]
# 14 计算所有元素的方差
# print(np.var(arr39))
# 11.916666666666666
# 15 计算每一行的标准差
# print(np.std(arr39,axis=1))
# [1.11803399 1.11803399 1.11803399]
# numpy中的统计函数运算是非常灵活的,既可以计算所有元素的统计值,也可以计算指定行或列的统计指标。还有其他常用的函数,如符号函数sign,ceil( >= x的最小整数),floor( <= x的最大整数),modf(
# 将浮点数的整数部分与小数部分分别存入两个独立的数组),cos,arccos,sin,arcsin,tan,arctan等。
# 一个函数是where(),它类似于Excel中的if函数,可以进行灵活的变换:
arr40 = 5-np.arange(1,13).reshape(3,4)
# print(arr40)
# [[ 4 3 2 1]
# [ 0 -1 -2 -3]
# [-4 -5 -6 -7]]
arr41 = np.where(arr40<0,"negtive","positive") #negtive 否定的 positive 正数
# print(arr41)
# [['positive' 'positive' 'positive' 'positive']
# ['positive' 'negtive' 'negtive' 'negtive']
# ['negtive' 'negtive' 'negtive' 'negtive']]
# 13-======其他函数
# unique(x):计算x的唯一元素,并返回有序结果
#
# intersect(x,y):计算x和y的公共元素,即交集
#
# union1d(x,y):计算x和y的并集
#
# setdiff1d(x,y):计算x和y的差集,即元素在x中,不在y中
#
# setxor1d(x,y):计算集合的对称差,即存在于一个数组中,但不同时存在于两个数组中
#
# in1d(x,y):判断x的元素是否包含于y中