创建数组及数组属性
np.array()
import numpy as np
#一维数组:
# arr = np.array([1,2,3,4,5,6])
#二维数组:
arr = np.array([[1,2,3],[2,3,4],[3,4,5]])
print("arr:",arr) # arr: [1 2 3 4 5 6]
print("arr 维度:",arr.ndim) # arr 维度: 1
print("arr 形状:",arr.shape) # arr 形状: (6,)
print("arr 元素总个数:",arr.size) # arr 元素总个数: 6
print("arr 数据类型:",arr.dtype) # arr 数据类型: int32
print("arr 元素大小:",arr.itemsize) # arr 元素大小: 4 占的字节数
np.arange()
#arange() 创建数组
#参数1:开始 包含
#参数2:截止 不包含
#参数3: 步长
arr = np.arange(0,10,2) # 起始位0 截止为10 步长为2 左闭右开
print(arr,arr.dtype) # [0 2 4 6 8] int32
linspace 创建 ----均匀分布
#参数1:开始 包含
#参数2: 截止 包含
#参数3: 元素个数
arr = np.linspace(1,10,5) # 起始位1 截止为10 均匀分布5个元素
print(arr,arr.dtype) # [ 1. 3.25 5.5 7.75 10. ] float64
logspace 创建
#参数1: 以10^开始次方 开始 包含
#参数2: 以10^开始次方 截止 包含
#参数3: 生成元素的个数
arr = np.logspace(1,3,10) # log 以10为底 10的1次方起始 10的3次方截止 生成10个元素的等比数列
print(arr,arr.dtype)
ones eye diag zeros
#参数 生成数组的shape # 全部元素都为0
arr = np.zeros((2, 3))
print(arr)
#参数 生成数组的shape # 全部元素都为1
arr = np.ones((2, 3))
print(arr)
#生成对角为1的数组 里面参数是一个数 表示生成数组为几行几列
arr = np.eye(3) # 二位数组
print(arr)
#生成指定对角元素的数组 传入参数多大,就生成几行几列
arr = np.diag([1, 2, 3, 4, 5]) # 指定对角线数组
print("arr:", arr)
生成随机数
#生成自动参数个0~ 1 之间的数组 包含0 不包含1
arr = np.random.random(3)
print("arr:",arr) # arr: [ 0.8064747 0.04547787 0.86599349]
符合正太分布的数组
arr = np.random.randn(2,3) # 标准正太分布 u=0,a=1
print("arr:",arr)
生成均匀分布的数组
#里面参数为几行几列
arr = np.random.rand(2,3) # [0,1)
print(arr)
数组索引 —直接下标、切片
#创建一个数组
arr = np.arange(10)
print("arr:",arr) # arr: [0 1 2 3 4 5 6 7 8 9]
#取5
print(arr[5])
#取5,6,7
print(arr[5:8])
print(arr[-5:-2])
#常见一个二维数组
arr = np.array([[1,2,3,4],[2,3,4,5],[3,4,5,6],[4,5,6,7]])
print("arr:",arr)
#取 前两行,所有
#利用切片取数据,同时切片,行逗号前为行,逗号后为列
print("取 前两行,所有行:",arr[:2,:])
#取第三行,4和5
print("取第三行,4和5:",arr[2,1:3])
#取第一行、第三行 的第一列和第四列数据
print("取第一行、第三行 的第一列和第四列数据:\n",arr[::2,::3])
print("取第一行、第三行 的第一列和第四列数据:\n",arr[(0,2),::3])
数组形状改变
#创建一个数组
arr = np.arange(16)
print("arr:",arr)
print("arr shape:",arr.shape) # (16,)
#直接更改 通过shape直接指定形状 --元祖状态
arr.shape=(4,4)
print("arr:",arr)
print("arr shape:",arr.shape)
#通过reshape更改----返回新的数组
arr_new = arr.reshape(4,4)
print("arr_new:",arr_new)
print("arr_new shape:",arr_new.shape)
#创建一个高维度数组
arr = np.arange(16).reshape(4,4)
print("arr:",arr)
print("arr shape:",arr.shape) # (16,) 16列 1行
#将高维数组展开
arr_new = arr.ravel()
print(arr_new)
#通过flatten进行展开
#参数:默认参数为C 按行展开,"F"按列展开
arr_new = arr.flatten()
print("arr_new:",arr_new)
arr_new = arr.flatten("F")
print("arr_new:",arr_new)
arr_new2 = arr.flatten("C")
print(arr_new2)
数组组合:
import numpy as np
#创建数组
arr1 = np.arange(6).reshape(2,3)
arr2 = np.array([[1,2,3],[2,3,4]])
print("arr1:",arr1)
print("arr2:",arr2)
#横向拼接
arr_new = np.hstack((arr1,arr2))
print("arr_new:",arr_new)
arr_new_1 = np.concatenate((arr1,arr2),axis=1) # axis : 轴 阵列将沿其连接的轴。默认值为0
print(arr_new_1)
#纵向拼接
arr_new = np.vstack((arr1,arr2))
print(arr_new)
arr_new_1 = np.concatenate((arr1,arr2),axis=0) # axis : 轴 阵列将沿其连接的轴。默认值为0
print(arr_new_1)
#concatenate 参数axis 为1 代表列,横轴方向
#axis 为0 代表行,为纵轴方向
#拼接的过程中,维度需要一致
#如果是横向拼接,必须保持行数一致
#如果是纵向拼接,必须保持列数一致
arr1 = np.arange(6).reshape(2,3)
arr2 = np.array([[1,2],[2,3],[3,4]]) # 必须保证转置之后与arr1同行同列 才能进行转置操作
arr_new = np.hstack((arr1,arr2.T))
print("arr_new:",arr_new)
#arr_new: [[0 1 2 1 2 3]
#[3 4 5 2 3 4]]
#arr_new_1 = np.concatenate((arr1,arr2),axis=1)
#print(arr_new_1)
## 数组拆分
import numpy as np
#创建数组
arr = np.arange(16).reshape(4, 4)
#print("arr:",arr)
#横向拆分 # 平分
#1:
#arr1,arr2 = np.hsplit(arr,2)
#print("arr1:",arr1)
#print("arr2:",arr2)
arr1_new = np.hsplit(arr, 4)
#print(arr1_new)
#2:
arr2_new = np.split(arr, 2, axis=1)
#print(arr2_new)
#纵向拆分 # 平分
#1:
arr_new = np.vsplit(arr, 2)
print(arr_new)
#2:
arr_new = np.split(arr, 4, axis=0)
print("arr_new", arr_new)
## 矩阵创建
#矩阵与数相乘---对应元素位置成数
m2 = m1*3
print("m2:",m2)
#矩阵的相加减
#矩阵相加---对应元素位置相加
#m2 = np.mat([[1, 1, 1], [1, 1, 1]]).reshape(3,2)
#print("m2:", m2)
m3 = m1 + m2
print("m3:", m3)
#对应元素位置 相减 如果形状不同,name不能运算,广播机制的问题
m3 = m1 - m2 # 等价于 m1 + (-m2)
print("m3->:", m3)
#m2 = np.mat([[1, 1, 1], [1, 1, 1]]).reshape(3,2)
#print("m2:", m2)
##矩阵相乘
##m,n * n,l = m,l # 左矩阵 列数 必须与右矩阵 行数相同
##不推荐直接相乘
#m4 = m1 * m2
#print("m4:", m4)
##推荐使用matmul,dot
#m5 = np.matmul(m1, m2)
#print("m5:", m5)
#m6 = np.dot(m1,m2)
#print("m6:",m6)
#矩阵对应元素相乘 # 同形矩阵
m7 = np.multiply(m1,m2)
print("m7:",m7)
m = np.mat("1 2 3;4 5 6;7 8 9")
print("m:",m)
print("m 的转置:",m.T) # 行列互换
print("m 的共轭转置:",m.H) # 先共轭再转置
print("m 的逆矩阵:",m.I) # 矩阵 * 逆矩阵= E(单位矩阵)
print("m 的视图:",m.A)
print("m 的视图类型:",type(m.A))
ufunc函数
import numpy as np
#创建数组
arr1 = np.arange(4).reshape(2, 2)
print("arr1:", arr1)
arr2 = np.array([[1, 2], [1, 2]])
print("arr2:", arr2)
#四则运算
#加法---对应元素相加
arr_new = arr1 + arr2
print("arr_new:", arr_new)
#减法---对应元素相减
arr_new2 = arr1 - arr2
print("arr_new2:", arr_new2)
#乘法---对应元素相乘
arr_new3 = arr1 * arr2
print("arr_new3:", arr_new3)
#除法---对应元素的相除
arr_new4 = arr1 / arr2
print("arr_new4:", arr_new4)
#幂----对应元素的幂
arr_new5 = arr1 ** arr2
print("arr_new5:", arr_new5)
#比较运算---对应元素的比较
print("arr1 >= arr2:", arr1 >= arr2)
#逻辑运算
#any 相当于or 有一个正确就返回True all 相当于and
print(np.any(arr1 == arr2)) # False
print(np.all(arr1 == arr2)) # False
广播机制
import numpy as np
# 创建数组
arr1 = np.array([[0,0,0,0],[1,1,1,1],[2,2,2,2],[3,3,3,3]])
print("arr1:",arr1)
print("arr1 shape:",arr1.shape)
arr2 =np.array([1,2,3,4])
print("arr2:",arr2)
# 执行相加 条件:shape : arr1: (n,m) ,arr2:(n,m) 或(n,1)或 (1,m)
arr_new = arr1+arr2
print("arr_new",arr_new)
读写文件
import numpy as np
# 以二进制进行保存数组
arr = np.arange(16).reshape(4,4)
arr2 = np.array([1,2,3,4])
arr3 = np.random.rand(3,2)
# 保存单个数组
# 参数1: 保存的文件名称
# 参数2 要保存的数组
# 保存的文件类型为 .npy 结尾的文件,保存到时候可以省略文件后缀
# np.save("./arr.npy",arr)
# print("保存完成")
# 读取我们保存的 npy文件
# arr = np.load("./arr.npy")
# print("arr:",arr)
# print("读取完成")
# 保存多个数组
# 参数1 文件路径+名称 后缀可以省略
# 后面参数: 要保存的数组
# 保存的文件类型为 .npz 结尾的文件
# 第一种保存方式
# np.savez("./arr_list.npz",arr=arr,arr2=arr2,arr3=arr3)
#
#
# # 第一种读取 .npz
# f = np.load("./arr_list.npz")
# print("arr:",arr)
# print("arr:",f['arr'])
# print("arr1:",f["arr2"])
# print("arr2:",f["arr3"])
# print("读取完成")
# 第二种保存方式
# np.savez("./arr_list1.npz",arr,arr2,arr3)
#
# # 第二种读取.npz
# f = np.load("./arr_list1.npz")
# print("f:",f)
# for temp in f:
# print(temp)
# print(f[temp])
# 保存成文本文件
np.savetxt("./arr.txt",arr,fmt="%d",delimiter=",")
print("保存完成")
#
# # 加载数据
# arr = np.loadtxt("./arr.txt",delimiter=",",dtype=np.int32)
# print("arr:",arr)
# print("arr 的类型:",arr.dtype)
# 加载数据2 genfromtxt (不仅可以读取txt文件)与 loadtxt区别?
arr = np.genfromtxt("./arr.txt",delimiter=",",dtype=np.int32)
print("arr:",arr)
数组排序
import numpy as np
# # 创建数组
# arr = np.arange(16,0,-1)
# print("arr:",arr)
# # 进行排序 默认升序
# arr.sort()
# print("arr:",arr)
# 创建一个二维数组
arr = np.arange(16,0,-1).reshape(4,4)
print("arr:",arr)
# axis=1 按照横向进行排序,列的方向
# arr.sort(axis=1)
# print("arr:",arr)
# axis=0 按照纵向进行排序,行的方向
arr.sort(axis=0)
print("arr:",arr)
# 创建一个数组
arr1 = np.arange(4,0,-1)
print("arr1:",arr1)
# argsort()
# 返回排序后的下标
res = arr1.argsort()
print("res:",res)
# lexsort()
a=[1,5,1,4,3,4,4] # 排序[1,1,3,4,4,4,5] -->若a在b后 一般看法的是[0,2,4,3,5,6,1]
b=[9,4,0,4,0,2,1] # 排序[0,0,1,2,4,4,9]--->若b在a前 一般看法是[2,4,6,5,1,3,0]
ret1 = np.lexsort((b,a))
print(ret1) # [2 0 4 6 5 3 1]
# b在前,a在后,即是先按照a的元素进行比较
# 如a中的最小值为两个1,其索引分别为0,2,再计较b中相应索引上的值,即9,0
# 对应的最小应是:1,0,而其对应的索引为2,所以排序后返回的结果第一个值为索引2
# 下一个最小应是:1,9,而其对应的索引为0,所以排序后返回的结果第一个值为索引0
# 以此类推...
# array([2, 0, 4, 6, 5, 3, 1], dtype=int64)
ret2 = np.lexsort((a,b))
print(ret2) # [2 4 6 5 3 1 0]
# a在前,b在后,即是先按照b的元素进行比较
# 如b中的最小值为两个0,其索引分别为0,4,再计较a中相应索引上的值,即1,3
# 对应的最小应是:0,1,而其对应的索引为2,所以排序后返回的结果第一个值为索引2
# 下一个最小应是:0,3,而其对应的索引为4,所以排序后返回的结果第一个值为索引4
# 以此类推...
# array([2, 4, 6, 5, 3, 1, 0], dtype=int64)
c=[[1,5,1,4,3,4,4],[9,4,0,4,0,2,1]]
# print(c)
ret3 = np.lexsort(c)
print(ret3) # [2 4 6 5 3 1 0]
# 此种情况与先b后a的情况一致
# array([2, 4, 6, 5, 3, 1, 0], dtype=int64)
数组去重
import numpy as np
# 创建一个数组
arr = np.array(["1","2","3","1","1","4","5","2"])
print("arr:",arr)
# 去重 + 排序
arr_new = np.unique(arr)
print("去重结果:",arr_new)
arr1 = np.arange(16).reshape(4,4)
print("arr1:",arr1)
# 参数1 要重复的数组
# 参数2 重复的次数
# tile 重复是对整个数组进行重复
arr_new = np.tile(arr1,2)
print("arr_new:",arr_new)
# repeats 重复数据
arr = np.arange(4).reshape(2,2)
print("arr:",arr)
# 重复数据 axis为重复的轴,axis=1 表示沿着横轴重复 axis=0 表示沿着纵轴重复
# repeat 重复是对行,列进行重复 并直接写在下一行或列中
arr_new_1 = np.repeat(arr,2,axis=1)
# arr_new_1 = np.repeat(arr,2,axis=0)
print("arr_new_1:",arr_new_1)
常用指标统计
import numpy as np
# 创建一个数组
arr = np.arange(9).reshape(3, 3)
print("arr:", arr)
# sum,mean,std,var,min,max,argmin,argmax,cumsum,cumprod 指标
# print("sum 的和为:",arr.sum())
# axis=0按照行的方向进行,纵轴
print("sum 和为:", np.sum(arr, axis=0))
print("mean 平均值为:", np.mean(arr, axis=0))
print("std 标准差为:", np.std(arr, axis=0))
print("var 方差为:", np.var(arr, axis=0))
print("min 最小值为:", np.min(arr, axis=0))
print("max 最大值为:", np.max(arr, axis=0))
print("argmin 最小值下标为:", np.argmin(arr, axis=0))
print("argmax 最大值下标为:", np.argmax(arr, axis=0))
print("cumsum 累计和为:", np.cumsum(arr, axis=0))
print("cumprod 累计积为:", np.cumprod(arr, axis=0))
# axis = 1按照列的方向