Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。
主要的功能:
1、ndarray,一个具有矢量运算和复杂广播工能的快速且节省空间的多维数组
2、用于对整组数据进行快速运算的标准数据函数(无需编写循环)
3、用于读写磁盘数据的工具以及用于操作内存映射文件的工具
4、线性代数、随机数生成以及傅里叶变换功能
5、用于集成由C、C++、Fortran等语言编写的代码的工具
一、Numpy的ndarray:一种多维数组对象、
numpy最重要的特点:
1、其N维数组对象(ndarray)
2、是一个快速灵活的大数据容器
3、可以利用这种数组对整块数据进行数学运算,其语法和标量元素之间的运算一样
4、ndarray中的所有元素必须是相同类型的。每个数组都有一个shape(表示各维度大小的元祖)和dtype(说明数组数据的对象)
1.1 ndarray的创建
1 import numpy as np 2 3 data = [1,2,3,4] 4 ‘‘‘ 5 array([1, 2, 3, 4]) 6 ‘‘‘ 7 arr = np.array(data) 8 9 #1 10 arr.ndim # 数组维度 11 12 #(4,) 13 arr.shape # 数组各维度大小的元祖
1 import numpy as np 2 3 #额外能创建ndarray的方法 4 5 np.zeros(10) # 创建指定长度形状的数组, 全0 6 np.zeros((3,2)) 7 np.zeros((1,2,3)) 8 9 np.ones() # 创建指定长度形状的数组, 全1 10 11 np.empty((2,3,2)) # 创建没有任何具体值的数组
1.2 ndarray的数据类型
Numpy的数据类型
类型 | 说明 |
int8、uint8 | 有符号和无符号的8位(一个字节)整型 |
int16、uint16 | 有符号和无符号的16位(两个个字节)整型 |
int32、uint32 | 有符号和无符号的32位(三个字节)整型 |
int64、uint64 | 有符号和无符号的64位(四个字节)整型 |
float16 | 半精度浮点数 |
float32 | 标准的单精度浮点数。与C的float兼容 |
float64 | 标准的双精度浮点数。与C的double和Python的float对象兼容 |
float128 | 扩展精度浮点数 |
complex64、complex128 | 分别用两个32位 、64位或128位浮点数表示的复数 |
bool | 存储Ture和Flase值的布尔类型 |
object | Python对象类型 |
String_ | 固定长度的字符串类型 |
Unicode_ | 固定长度的Unicode类型(字节数由平台决定) |
dtype是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息。
1 import numpy as np 2 3 arr = np.array([1,2,3], dtype=np.float64) 4 arr.dtype 5 6 arr.astype(np.float32) # 转换为dtype
二、数组和标量之间的运算
大小相等的数组之间的任何算术运算都会将运算应用到元素级别
1 import numpy as np 2 3 arr1 = np.array([[1,2,3],[3,4,5]]) 4 arr2 = np.array([[6,7,8],[9,10,11]]) 5 6 ‘‘‘ 7 array([[ 7, 9, 11], 8 [12, 14, 16]]) 9 ‘‘‘ 10 arr1 + arr2 11 12 13 ‘‘‘ 14 array([[-5, -5, -5], 15 [-6, -6, -6]]) 16 ‘‘‘ 17 arr1 - arr2 18 19 ‘‘‘ 20 array([[ 6, 14, 24], 21 [27, 40, 55]]) 22 ‘‘‘ 23 arr1 * arr2 24 25 ‘‘‘ 26 array([[ 0.16666667, 0.28571429, 0.375 ], 27 [ 0.33333333, 0.4 , 0.45454545]]) 28 ‘‘‘ 29 arr1 / arr2
不同大小的数组之间的运算叫做广播(broadcasting)会在后面的内容中单独讲,本身是一个非常重要的概念
三、基本的索引和切片
一维数组的索引和切片和Python列表的功能差不多,这里只做简单的举例,不做更多说明。
区别的地方需要单独说明:1、在numpy的数组中,如果你将一个标量值赋值给一个切片时,例如arr[3:4] = 8,该值就会自动赋值给这个切片选区中,即(3,4]位置上的值都变成8;2、numpy中数组的切片时原始数组的视图,数据不会被复制,视图上的任何修改都会直接反应到原数组上。
1 import numpy as np 2 3 arr = np.array([1,2,3,4,5,6]) 4 5 arr[2,4] = 44 6 7 ‘‘‘ 8 array([1,2,44,44,5,6]) 9 ‘‘‘ 10 print(arr)
二维数组中,各个索引位置上的元素不再是标量而是一维数组,依次类推多维也是这样
import numpy as np arr2d = np.array([[1,2,3],[2,3,4],[3,4,5]]) ‘‘‘ array([3,4,5]) ‘‘‘ arr2d[2] arr2d[0][2] # 等价于 arr2d[0,2]
二维数组的索引方式:纵轴表示 axis0,横轴表示axis1
ndarray的切片语法跟Python列表这样的一维对象差不多,在多维度上也是一样的,但是我们需要记住各个索引位置的元素不再是标量二维一维数组
1 import numpty as np 2 3 arr = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]]) 4 5 ‘‘‘ 6 array([[1,2,3],[2,3,4]]) 7 ‘‘‘ 8 arr[:2]
1 import numpty as np 2 3 arr = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]]) 4 5 ‘‘‘ 6 array([[1],[2]]) 7 ‘‘‘ 8 arr[:2,:,1]
四、布尔型索引
可以对ndarray中的数据做布尔类型的判断截取
1 import numpy as np 2 3 arr = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]]) 4 5 ‘‘‘ 6 array([4, 5, 4, 5, 6, 4, 5, 6, 7]) 7 ‘‘‘ 8 arr[arr > 3] 9 10 ‘‘‘ 11 array([3, 3, 3]) 12 ‘‘‘ 13 arr[arr == 3] 14 15 ‘‘‘ 16 array([1, 2, 2]) 17 ‘‘‘ 18 arr[arr < 3]
五、花式索引
花式索引(Fancy indexing)是一个Numpy术语,它指的是利用整数数组进行索引。
为了以特定顺序选取行子集,只需要传入一个用于指定顺序的整数列表或者ndarray,以下为例子:
1 import numpy as np 2 3 ‘‘‘ 4 array([[ 0., 0., 0., 0.], 5 [ 1., 1., 1., 1.], 6 [ 2., 2., 2., 2.], 7 [ 3., 3., 3., 3.], 8 [ 4., 4., 4., 4.], 9 [ 5., 5., 5., 5.], 10 [ 6., 6., 6., 6.], 11 [ 7., 7., 7., 7.]]) 12 ‘‘‘ 13 arr 14 15 ‘‘‘ 16 array([[ 4., 4., 4., 4.], 17 [ 3., 3., 3., 3.], 18 [ 0., 0., 0., 0.], 19 [ 6., 6., 6., 6.]]) 20 ‘‘‘ 21 arrr[[4,3,0,6]] # 传入了指定顺序的整数列,4,3,0,6是顺序 22 23 arr[[-1,-2,-5]] # 负数从尾部开始取,顺序
一次传入多个索引数组的情况,以下为实例:
1 import numpy as np 2 3 ‘‘‘ 4 array([[ 0, 1, 2, 3], 5 [ 4, 5, 6, 7], 6 [ 8, 9, 10, 11], 7 [12, 13, 14, 15], 8 [16, 17, 18, 19], 9 [20, 21, 22, 23], 10 [24, 25, 26, 27], 11 [28, 29, 30, 31]]) 12 ‘‘‘ 13 arr = np.arange(32).reshape((8,4)) 14 15 ‘‘‘ 16 array([4,23,29,10]) 17 ‘‘‘ 18 arr[[1,5,7,2],[0,3,1,2]] #最终取出的数据是 坐标(1,0)(5,3)(7,1)(2,2) 19 20 ‘‘‘ 21 array([[ 4, 7, 5, 6], 22 [20, 23, 21, 22], 23 [28, 31, 29, 30], 24 [ 8, 11, 9, 10]]) 25 ‘‘‘ 26 arr[[1,5,7,2]][:,[0,3,1,2]] # 获取矩形区域 27 28 ‘‘‘ 29 np.ix() 将两个一维整数数组转换为一个用于选取方形区域的索引器 30 ‘‘‘ 31 arr[np.ix([1,5,7,2],[0,3,1,2])] # 得到和上面一样的结果
六、常用一元函数
函数 | 说明 |
abs、fabs | 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs |
sqrt | 计算各元素的平方根。相当于arr**0.5 |
square | 计算各元素的平方。相当于arr**2 |
exp | 计算各元素的指数 |
log log10 log2 log1p | 分别为自然对数(底数为e)、底数为10的log、底数为2的log 、 log(1+x) |
sign | 计算各元素的正负号:1正数,0零,-1负数 |
ceil | 计算各元素的ceiling值,即大于等于该值的最小整数 |
floor | 计算各元素的floor值,即小于等于该值的最大整数 |
rint | 将各元素值四舍五入到最接近的整数,保留dtype |
modf | 将数组的小数和整数部分以两个独立数组的形式返回 |
isnan | 返回一个表示NAN的布尔型数组 |
isfinite isinf | 分别返回一个表示,那些元素是有穷的 或者 哪些元素是无穷的 布尔类型数组 |
cos cosh sin sinh | 普通型和双曲型三角函数 |
arccos arccosh arcsin arcsinh arctan arctanh |
反三角函数 |
logical_not | 计算各元素not x的真值。相当于-arr |
七、二元常用函数
函数 | 说明 |
add | 将数组中对应的元素相加 |
subtract | 从第一个数组中减去第二个数组中的元素 |
multiply | 数组元素相乘 |
divide、floor_divide | 除法或向下圆除法 |
power | 对第一个数组中的元素A,根据第二个数组中的相应元素B,计算AB |
maximum、fmax | 计算元素级的最大值 fmax将忽略NaN |
minimum、fmin | 计算元素级的最小值计算 fmin将忽略NaN |
mod | 元素级的求模计算(除法的余数) |
copysign | 将第二个数组中的值的符号复制给第一个数组中的值 |
greater、greater_equal less、less_equal equal、not_equal |
执行元素级的比较运算,最终产生布尔型数组。相当于> >= <= < == != |
logical_and logical_or logical_xor |
执行元素级的真值逻辑运算。相当于& | ^ |
八、基本数组统计方法
方法 | 说明 |
sum | 对数组中全部或某轴向的元素求和。零长度的数组和sum为0 |
mean | 算术平均数。零长度的数组的mean为NAN |
std、var | 分别为标准差和方差,自由度可调(默认为n) |
min、max | 最大值和最小值 |
argmin、argmax | 分别为最大和最小元素的索引 |
cumsum | 所有元素的累计和 |
comprod | 所有元素的累计积 |
作为布尔类型数组的方法
arr.any() 数组中是否存在一个或多个True
arr.all() 数组中是否所有的值都为True
排序:arr.sort() 返回排序后的数组
九、数组的集合运算
方法 | 说明 |
unique(x) | 计算x中的唯一元素,并返回有序结果 |
intersect1d(x,y) | 计算x和y中的公共元素,并返回有序结果 |
union1d(x,y) | 计算x和y的并集,并返回有序结果 |
in1d(x,y) | 得到一个表示‘x的元素是包含于y’的布尔数组 |
setdiff1d(x,y) | 集合的差,即元素在x中且不在y中 |
setxor1d(x,y) | 集合的对称差,即存在于一个数组中单不同时存在于两个数组中的元素 |
内容参考自《利用Python进行数据分析》