最近看了《利用Python进行数据分析》,又复习了一下Numpy里的一些操作,做一些基本函数使用的总结,避免后面忘了又瞎找,提高效率。
一、 数组生成
-
创建数组
# 1. 一维数组 import numpy as np num = [ 1,2,3,4,5] data = np.array(num) # 使用 numpy.array()/ numpy.asarray() 创建数组,返回数组类型 #numpy.array()和numpy.asarray()区别:数据源为ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会 print data print type(data) print data.dtype # 2. 创建二维/多维数组 arr = [ [1,2,3], [2,2.5,3], [3,4,5.5] ] data1 = np.array(arr) print data1 print data1.shape print type(data1) print data1.dtype
一维数组结果如下左图, 二维/多维数组为右图:
左图中数据list为 int,返回结果中的数组的dtype为int32;
右图中的list 为 3行 ×3列的高纬列表, 且其中含有浮点数,所以创建的多维度数组的dtype为float64; shape查看数组维度(几行几列, 列表内嵌套几个列表为行数len(data1),每个列表有几个数据为列数len(data[1))(此时数据指常用的二维数组, 多维度同理向内递推)。
如果:行数 != 列数, 结果如下:
#创建全0, 全1数组和不确定值的数组 np.zeros(10) #创建 10个数全0的一维度数组 np.zeros((3,5)) # 创建一个3行、5列全为0的数组 , 函数括号中的元组为指定维度 np.ones() #和 zeros() 同理 , 创建全1数组 np.empty((3,2,2)) # 创建不确定值的数组, 元组指定维度,因为empty会返回全0数组,不安全,多数情况下为未初始化的垃圾值(此处源于《利用Python进行数据分析》) np.random.randn() # 正态分布数组创建 # arange() 创建整数组 arr3 = np.arange(15) arr4 = np.arange(15).reshape((3,5)) #创建 3行5列 的整数数组 print arr3 print arr4
#创建对角矩阵 np.identity(5) #生成5×5的对角矩阵
-
ndarray 数据类型:
A、常用常用:
int8,uint8(符号和无符号, 还有int/uint16,int/uint32,int/uint65) 整型
float16、float32、float64、float128(半精度浮点数、单精度、双精度、扩展精度)
bool 布尔
object (Python 对象)
string (固定字符类型)
B、类型操作:
# 创建数组时,指定 data = pd.array(data, dtype=int32) # astype() 强制转换 data.astype(int32) # 强转为int32 data.astype(int) # 强转为int, 根据数据类型映射对应的dtype
二、索引和切片
-
低纬度索引与切片
array 切片和索引与list的基本相同
# 索引, 结果 下左图 arr4 = np.arange(10).reshape((2,5)) print arr4[0] print arr4[0][4] # 访问数字4
#以切片形式“广播式”得修改其中的值 arr5 = np.arange(10) # 其中可以看到切片是在原始数据的视图,而不是拷贝,通过切片修改数据会改变原始数据;且拷贝多次会影响性能和占用大量内存 print arr5 arr5[3:5] = 12 print arr5 arr5[3:5].copy() #对数据做显示的深拷贝
-
高维素组索引与切片
-
二维数组索引与切片(多维度数组切片方式和二维数组一样)
# 切片 下右图 data[a:b, c:d]#其中a:b 行切片, c:d列切片 arr2d = np.arange(1,10,1).reshape((3,3)) print arr2d print arr2d[:1,1:] # 切片是“包前不包后”(满嘴顺口溜,你想考研啊!!!) , :1 表示 第1行之前的数据(从0开始arr2d[0], [1,2,3] ); 1: 表示第一列arr2d[0]之后的数据arr[0][1:] ,为[2,3] print arr2d[:2,:1] # 与上述同理
-
高纬度数组索引(以三维数组为例)
# 高纬度数组 维度解释 np.arange(12).reshape((2,2,3)) # arr[0]维度2×3, 有像arr[0]的有2个, 所以维度为 2× (2×3), arr[0] = [[ 0, 1, 2],[ 3, 4, 5]] test_arr1 = np.arange(12).reshape((3,2,2)) ## arr[0]维度2×2, 有像arr[0]的有3个, 所以维度为 3× (2×2) print test_arr1 print test_arr1[0].shape
# 多维数组索引就是层层递推访问 arr_3d_one = np.arange(12).reshape((2,2,3)) print "数组:" + str(arr_3d_one) print "第一维度:"+str(arr_3d_one[0]) + '\n' #数组第一维度索引 print "第二维度: " + str(arr_3d_one[0,0]) + '\n' #向下一维度索引 print "第三维度: " + str(arr_3d_one[0,0,1]) + '\n' #向第三维度索引 print "数组第一维度长:%s" %( len(arr_3d_one) ) print "第二维度数组纬度值:%s" % str(arr_3d_one[0].shape)
-
布尔索引:
-
布尔索引的过程是通过创建一个布尔数组, 根据布尔数组中为True的索引值来 索引源数组
random_values = np.random.randn(3,7) # 3×7 符合正态分布的随机数 print random_values stars = np.array(['Jordan', 'James', 'Kobe']) stars == 'James' # 生成一个布尔数组(3×1), 布尔数组长度 和 源数组轴长必须 相等 random_values[stars == "James"] # random_value[1], 布尔为真的行来索引
-
创建布尔数组时, 可以使用 != 、| (或)、&(与)
stars == 'Jordan' stars != 'Jordan' (stars == 'Jordan') | (stars == 'James')
-
花式索引、转置和轴对换
-
花式索引——利用整数数组来索引 (花式索引会复制一个数组)
A. 花式索引————创建一维整数数组
在《利用Python进行数据分析》中的例子是这样的
#结果如下左图 arr = np.empty((8,4)) # np.empty, 返回无初始化的数组 for i in range(8): arr[i] = i print arr[[4, 3, 2, 1]] print arr[[-3, -5, -1]] #这样很容易产生一种疑问或者误解, 我用整数数组[4, 3, 2, 1]数组值对应目标数组中的值时才会索引,为啥反向索引用的是;但是这样是错的 #用其他例子证明我自己理解错误了, 没有初始化那段,用随机值来证明是创建一个1维的整数索引数组, 可以使用正向、反向索引(-1开始) arr1 = np.empty((8, 4)) print arr1 print arr1[[1, 3 ,5]] print arr1[[-1, -3, -5]]
输出结果如下:
B.花式索引————多维索引
#多维度数组就是利用 创建行索引与列索引之前的映射精确到具体值 arr = np.arange(16).reshape((4,4)) arr[[1,2,3], [2,2,3] arr1 = np.arange(32).reshape((8,4)) print arr1 print arr1[[1,5,7,2]][:,[0,3,1,2]] # 我理解的索引获取到一个区域, 其理解是 [1,5,7,2][0]= [4,20,28,8] 为第一列,其他历次顺序排 #np.ix_()也可以实现区域索引器 arr1[np.ix_([1,5,7,2], [0,3,1,2])]
-
转置和轴变化
# 转置 arr.T #转置属性 np.dot(arr, arr.T) # 求矩阵内积 arr.transpose() #轴变化 arr.swapaxes()
三、常用函数总结
-
常用函数
np.arange #整数数组 np.abs #绝对值 np.exp # e的 幂次方(指数) np.sqsrt # 平方根 np.square # 平方 #其他的就在文档里可以找到 # 常用统计函数 np.sum # 求和 np.mean #平均值 np.std # 标准差 np.min/ np.max # 最大/最小值 np.var # 方差
-
Numpy中where使用
# np.where 就是 x if y else z 的矢量表示
arr3 = np.arange(10)
np.where(arr3<5, arr3, 10 * arr3) # arr3元素 < 5, 元素不变, 否则乘以10
-
其他功能
np.sort # 数组排序,和Python sort函数一样是快排 , 返回已经排序的副本 # 集合操作 np.unique # 数组中唯一值,并返回排序结果 就是 类似list转为集合并排序 np.in1d # 一个数组在另一个数组中是否存在, 返回布尔类型的数组 np.intersect1d(x, y) # x, y 的交集 np.union1d(x,y) # x, y 的并集 np.setdiff1d(x, y) # 集合的差, 在x中不在y中 np.setxor1d(x, y) # 集合对称差,在1个数组但不同时在2个数组中 # numpy文件读写, save和load函数 np.save(file_name, data) #文件尾部无 .npy 格式会自动加上 .npy np.load('file_name.npy') # 加载数组为数组类型 np.savez # 保存为一个 .npz的压缩文件 # 矩阵运算 np.dot(x, y) / x.dot(y) # 矩阵乘法 np.trace # 对角元素和 np.det # 矩阵的行列式 np.eig # 方阵的 本征值和本征向量 np.inv # 方阵的逆 np.pinv # 矩阵的 Moore-Penrose伪逆 np.qr # QR分解 np.svd # 奇异值分解 np.solve # 解线性方程组 Ax = B, A为方阵 np.lstsq # Ax = b 最小二乘解 #随机数 , np.random模块 np.randint # 给定上下范围的随机整数 np.randn # 正态分布, 均值= 0, 标准差=1的样本值 np.normal # 正太分布样本值 np.beta # beta分布样本值 # 还有很多其他随机数相关、分布相关函数,具体参考numpy手册,或者help函数查看用法
整理完了numpy ,下面再来复习总结下重头戏 Pandas