最近看了《利用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