numpy函数和⽤法总结、⽰例
最近看了《利⽤Python进⾏数据分析》,⼜复习了⼀下Numpy⾥的⼀些操作,做⼀些基本函数使⽤的总结,避免后⾯忘了⼜瞎,提⾼效率。
⼀、数组⽣成
1. 创建数组
# 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.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的对⾓矩阵
2.  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
⼆、索引和切⽚
1. 低纬度索引与切⽚
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()    #对数据做显⽰的深拷贝
2. ⾼维素组索引与切⽚
⼆维数组索引与切⽚(多维度数组切⽚⽅式和⼆维数组⼀样)
# 切⽚下右图 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)
3. 布尔索引:
布尔索引的过程是通过创建⼀个布尔数组,根据布尔数组中为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')
3. 花式索引、转置和轴对换
花式索引——利⽤整数数组来索引 (花式索引会复制⼀个数组)
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.swapaxes()
三、常⽤函数总结
1. 常⽤函数
np.arange    #整数数组
np.abs          #绝对值
np.sqsrt        # 平⽅根
np.square    # 平⽅
#其他的就在⽂档⾥可以到
# 常⽤统计函数
np.sum          # 求和numpy库不具有的功能有
np.std      # 标准差
np.min/ np.max # 最⼤/最⼩值
np.var      # ⽅差
2. Numpy中where使⽤
#  np.where 就是 x  if  y else z 的⽮量表⽰
arr3 = np.arange(10)
np.where(arr3<5, arr3, 10 * arr3)    #  arr3元素 < 5, 元素不变,否则乘以10
3. 其他功能
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.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.beta                                  # beta分布样本值
# 还有很多其他随机数相关、分布相关函数,具体参考numpy⼿册,或者help函数查看⽤法整理完了numpy ,下⾯再来复习总结下重头戏 Pandas