一.numpy简介
Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包,它是几乎所有高级工具的构建基础。其部分功能如下:
1)ndarray,一个具有矢量算数运算和复杂广播能力的快速且节省空间的多维数组。
2)用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
3)用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
4)线性代数、随机数生成以及傅里叶变换功能。
5)用于集成由C、C++、Fortran等语言编写的代码工具。
Numpy本身并没有提供多么高级的数据分析功能,理解Numpy数组以及面向数组的计算将有助于我们更加高效地使用诸如pandas之类的工具。
对于大部分数据分析应用而言,我们最关注的功能主要集中在:
1)用于数据整理和清理、子集构造和过滤、转换等快速的矢量化数组运算。
2)常用的数组算法,如排序、唯一化、集合运算等。
3)高效地描述统计和数据聚合/摘要运算。
4)用于异构数据集的合并/连接运算的数据对齐和关系型数据运算。
5)将条件逻辑表述为数组表达式(而不是带有if-elif-else分支的循环)。
6)数据的分组运算(聚合、转换、函数应用等)。
二.Numpy的ndarray:一种多维数组对象
Numpy最重要的一个特点就是其N为数组对象(即ndarray),该对象是一个快速而灵活的大数据集容器。我们可以利用这种数组对整块数据执行一些数学运算,其语法跟标量元素之间的运算一样:
import numpy as np
a1=np.array([[1,3,5,7],[2,4,6,8]])
print(a1)
print(a1*2)
print(a1+a1)
ndarray是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的。每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于书名数组数据类型的对象)
import numpy as np
a1=np.array([[1,3,5,7],[2,4,6,8]])
print(a1.shape)
print(a1.dtype)
1.创建ndarray
创建数组最简单的方法就是使用array函数。它接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的Numpy数组
import numpy as np
a2=np.array([1,2,3,4])
a3=np.array([[5,24,8,10],[6,15,9,18]])
print(a2)
print(a3)
除了np.array,还有一些函数也可以新建数组。比如,zeros和ones分别可以指定长度或形状的全0或者全1数组,empty可以创建一个没有任何具体值的数组,要用这些方法创建多维数组,只需传入一个表示形状的元组即可:
import numpy as np
a4=np.zeros(5)
a5=np.ones(5)
a6=np.empty(5)
print(a4)
print(a5)
print(a6)
arrange是Python内置函数range的数组版
import numpy as np
print(np.arange(8))
2.ndarray数据类型
bool 用一位存储的布尔类型(值为TRUE或FALSE) inti 由所在平台决定其精度的整数(一般为int32或int64) int8 整数,范围为-128至127 int16 整数,范围为-32 768至32 767 int32 整数,范围为-2147483648 至 2147483647 int64 整数,范围为-9223372036854775808 至 9223372036854775807 uint8 无符号整数,范围为0至255 uint16 无符号整数,范围为0至65 535 uint32 无符号整数,范围为0 至 4294967295 uint64 无符号整数,范围为0 至 18446744073709551615 float16 半精度浮点数(16位):其中用1位表示正负号,5位表示指数,10位表示尾数 float32 单精度浮点数(32位):其中用1位表示正负号,8位表示指数,23位表示尾数 float64或float 双精度浮点数(64位):其中用1位表示正负号,11位表示指数,52位表示尾数 complex64 复数,分别用两个32位浮点数表示实部和虚部 complex128或complex 复数,分别用两个64位浮点数表示实部和虚部
我们可以通过astype显式地转换其dtype:
import numpy as np
arr=np.array([[1,2,3,4],[5,6,7,8]])
print(arr.dtype) #整数型
print(arr.astype(np.float32).dtype) #通过astype将整数型转浮点型
3.基本的索引和切片
Numpy数组的索引是一个内容丰富的主题,首先从一维数组说起
import numpy as np
arr=np.arange(8)
print(arr[5:8])
print(arr[6])
arr[5:8]=24
print(arr)
当标量值赋给一个切片时,该值会自动传播到整个选区。跟列表最重要的区别在于。数组切片是原始数组的视图,这意味着数据不会复制,视图上的任何
修改都会直接反映到源数组上。
对于高维数组,要做的事情更多,在一个二维数组中,各索引位置上的元素不再是标量而是一维数组
import numpy as np
arr2d=np.array([[5,24,8,10],[6,15,9,18]])
print(arr2d[1]) #输出第二个一维数组
print(arr2d[1][2])#输出第二个一维数组的第三个元素
print(arr2d[1,2]) #同上
#2x2x3数组
arr3d=np.array([[[1,2,3],[5,6,7]],[[8,9,10],[11,12,13]]])
print(arr3d)
print(arr3d[0]) #数组的第一个元素,也就是一个2x3数组
#标量值和数组都可以被赋值给arr3d[0]
old_values=arr3d[0].copy()
arr3d[0]=24 #把24赋值给2x3数组的每个标量元素
print(arr3d)
arr3d[0]=old_values
print(arr3d)
#切片索引
#对于二维数组,其切片方式与一维数组稍有不同,切片是沿着一个轴向选取元素的
print(arr2d[:1,:2]) #一次传入多个切片,就像传入索引那样,[[ 5 24]]
print(arr2d[1,0:2]) #源数组第二个元素的前两个元素,[ 6 15]
print(arr2d[:,0:2]) #只有冒号表示选取整个轴,[[ 5 24],[ 6 15]]
names=np.array([\'Bob\',\'Joe\',\'Calvin\',\'Kobe\',\'Calvin\',\'Calvin\',\'Michale\'])
data=np.random.randn(7,4)
print(names)
print(data)
print(names==\'Calvin\') #对names和字符串Calvin的比较运算将会产生一个布尔型数组
#这个布尔型数组可用于数组索引
print(data[names==\'Calvin\'])
#布尔型数组的长度必须跟被索引的轴长度一致。此外还可以将布尔型数组跟切片,整数混合使用
print(data[names==\'Calvin\',1:])
print(data[names==\'Kobe\'])
#要选择除Calvin之外的其他值,可以使用不等号(!=):
print(names!=\'Calvin\')
#选取三个名字中的两个组合需要用到多个布尔条件,使用&(和)、|(或)之类的布尔算术运算符即可:
mask=(names==\'Bob\')|(names==\'Kobe\')
print(data[mask])
#通过布尔型数组设置值是一种经常用的手段。为了将data中小于0的元素全部设置为0,我们只需:
data[data<0]=0
print(data)
#通过一维布尔数组设置整行或整列的值
data[names==\'Joe\']=7
print(data)
#花式索引是一个Numpy术语,它指的是利用整数数组进行索引,假设我们有一个8x4数组
arr=np.empty((8,4))
for i in range(8):
arr[i]=i
# print(arr)
#以特定的顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray即可
print(arr[[2,5,0,1]])
print(arr[[-2,-5,-1,-3]])#使用负数索引将末尾开始选取行
#一次传入多个索引数组会有一个特点。它返回的是一个一维数组,其中的元素对应各个索引元组
arr=np.arange(32).reshape(8,4)
print(arr)
print(arr[[1,4,6,7],[2,1,2,3]]) #(1,2),第2行第3列(从0开始)对应的元素是6,(4,1)第5行第2列是17,(6,2)第7行第3列是26,(7,3)第8行第4列是31
#如果要想上面指定顺序的整数列表一样得到矩形区域的形式,
print(arr[[1,4,6,7]][:,[2,1,2,3]]) #前面数组表示行,从行开始一行行遍历第二个数组作为列,取对应的值组成一个多维数组
#另一个方法是使用np.ix_函数,它可以将两个一维整数数组转换为一个用于选取方形区域的索引器
print(arr[np.ix_([1,4,6,7],[2,1,2,3])])
#注:花式索引跟切片不一样,它总是将数据复制到新数组中
4.数组转置和轴对换
#转置(transpose)是重塑的一种特殊形式,它返回的是源数据的视图(不会进行任何复制操作).
#首先从二维数组开始,构造一个数组如下:
arr=np.arange(6).reshape(2,3)
# print(arr)
# print(arr.T) #使用T属性进行轴对换
# print(arr.transpose(1,0)) #用transpose函数也可以进行轴对换(0,1表示轴编号)
# print(arr.swapaxes(1,0)) #swapaxes函数与transpose一样,也可以进行轴对换(0,1表示编号)
#可以看出,以上变换是等价的,均是一种“轴变换”
#二维数组相对简单,三维数据相对复杂点,下面构造三维数组
arr3d=np.arange(12).reshape(2,2,3)
print(arr3d)
#此时可用arr3d[x][y][z](x=0,1;y=0,1;z=0,1,2),x对应轴0,y对应轴1,z对应轴2,看下图会更直观一点:
#有上图可用看出0元素是arr3d[0][0][0],1元素是arr3d[0][0][1],2元素是arr3d[0][0][2],3元素是arr3d[0][1][0],4元素是arr3d[0][1][1]
#5元素是arr3d[0][1][2],6元素是arr3d[1][0][0],7元素是arr3d[1][0][1],8元素是arr3d[1][0][2],9元素是arr3d[1][1][0],10元素arr3d[1][1][1]
#11元素是arr3d[1][1][2]
#现在x,y轴互换位置,对应的元素位置也会互换,3,4,5 与6,7,8的位置互换,其他不变
print(arr3d.transpose(1,0,2))
print(arr3d.swapaxes(1,0,2))