Numpy基础学习

  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进行数据分析》

原文地址:https://www.cnblogs.com/ymkfnuiwgij/p/7771637.html