2.2 常用基础库
2.2.1 Numpy
Numpy是Python的高性能科学计算基础库,基于ndarray(n-dimensional array object,一种多维数据对象,实现了多种操作和数学运算)。该对象与Python提供的list数据结构十分类似,但是list存储的是数据指针,而ndarray存储的是数值。同时,Python也提供array来存储数值,但array是一维数组。引入ndarray并配合ufucn函数可以更高效地实现数据处理。本节围绕ndarray的创建、存取、选择、函数运算以及I/O操作举例说明,让读者对Numpy有直观的认知,表2-1是Numpy的内容概览。
表2-1 Numpy内容概览
官网手册
https://docs.scipy.org/doc/numpy/reference/
示例版本
版本号:1.11版本
日期:2016.5.29
示例讲解
(1)引入包
>>>import numpy as np
(2)数组的创建
>>>a = np.array([1, 2, 3, 4, 5], dtype=np.int32) >>>print a [1 2 3 4 5] >>>b = np.array([[1, 2], [3, 4], [5, 6]], dtype=np.int32) >>>print b [[1 2] [3 4] [5 6]] >>>#通过Numpy提供的函数来创建数组 >>>#arange函数创建数组 >>>a = np.arange(1, 10, 1) >>>print a [1 2 3 4 5 6 7 8 9] >>>print type(a) <type 'numpy.ndarray'> >>>print a.dtype int64 >>>#linspace函数创建数组。指定开始值、终止值以及元素个数来创建一维数组,该 数组各个值成等差数列 >>>a = np.linspace(1, 10, 20) >>>print a [ 1. 1.47368421 1.94736842 2.42105263 2.89473684 3.36842105 3.84210526 4.31578947 4.78947368 5.26315789 5.73684211 6.21052632 6.68421053 7.15789474 7.63157895 8.10526316 8.57894737 9.05263158 9.52631579 10. ] >>>print a.dtype float64 >>>#logspace函数创建数组。指定开始值、终止值以及元素个数来创建一维数组,该 数组各个值成等比数列 >>>a = np.logspace(1, 10, 8) >>>print a [ 1.00000000e+01 1.93069773e+02 3.72759372e+03 7.19685673e+04 1.38949549e+062.68269580e+07 5.17947468e+08 1.00000000e+10] >>>print a.dtype float64 >>>#fromfunction函数创建数组。该函数的第一个参数为计算数据元素的函数;第二 个参数是代表数组的大小的序列,序列的每一个值代表数组对应维度的大小 >>>def funcA(i): ... returni + i >>>a = np.fromfunction(funcA, (10, )) >>>print a [ 0. 2. 4. 6. 8. 10. 12. 14. 16. 18.] >>>print a.dtype float64 >>>def funcB(i, j): ... returni + j ... >>>b = np.fromfunction(funcB, (3, 3)) >>>print b [[ 0. 1. 2.] [ 1. 2. 3.] [ 2. 3. 4.]] >>>print b.dtype float64
(3)shape与reshape函数
>>> #内容:shape与reshape函数 >>>a = np.array([1, 2, 3, 4, 5]) >>>#查看数组大小 >>>print a.shape (5, ) >>>b = np.array([[1, 2, 3], [4, 5, 6]]) >>>print b.shape (2, 3) >>>#调用reshape改变数组的重新排列数组维度,同时,保存数组的大小不变 >>>a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) >>>print a.shape (10, ) >>>b = a.reshape(2, 5) >>>print b [[ 1 2 3 4 5] [ 6 7 8 9 10]] >>>a.reshape(-1, 2) [[ 1 2] [ 3 4] [ 5 6] [ 7 8] [ 9 10]] >>>a.reshape(2, 2) Traceback (most recent call last): File "<stdin>", line 1, in<module> ValueError: total size of new array must be unchanged
(4)获取ndarray数组元素
>>> #内容:数组存取 >>>#下标存取 >>>a = np.arange(1, 10, 1) >>>print a [1 2 3 4 5 6 7 8 9] >>>a[0] 1 >>>a[0:] array([1, 2, 3, 4, 5, 6, 7, 8, 9]) >>>a[:-1] array([1, 2, 3, 4, 5, 6, 7, 8]) >>>a[1:8:2] array([2, 4, 6, 8]) >>>a[::-1] array([9, 8, 7, 6, 5, 4, 3, 2, 1]) >>> #同时,根据下标存储获取的数组与原数组共享地址空间。示例如下 >>>a = np.arange(1, 10, 1) >>>print a [1 2 3 4 5 6 7 8 9] >>>b = a[0:3] >>>print b [1 2 3] >>>b[1] = -10 >>>print b [ 1-10 3] >>>printa [ 1-10 3 4 5 6 7 8 9] >>> #使用整数序列作为数据下标,从而获取数组元素。与使用下标获取数组不同的是, 其结果不与原数组共享地址空间 >>>a = np.arange(1, 10, 1) >>>print a [1 2 3 4 5 6 7 8 9] >>>b = a[[1, 2, 5]] >>>print b [2 3 6] >>>b[0] = 100 >>>print b [100 3 6] >>>print a [1 2 3 4 5 6 7 8 9] >>>#使用布尔数组作为数据下标,从而获取数组元素 >>>a = np.arange(1, 5, 1) >>>print a [1 2 3 4] >>>a> 2 array([False, False, True, True], dtype=bool) >>>a[a> 2] array([3, 4])
(5)ufunc函数
ufunc的全称是universal function,即通用处理函数。Numpy提供的ufunc函数大致可以划分为五类,分别为:Math operations(数学操作)、Trigonometric functions(三角函数)、Bit-twiddling functions(位操作)、Comparison functions(比较函数)以及Floating functions(浮点函数)。下面分别对各种类型的部分函数给出使用示例。
>>> #内容:数学函数 >>> #数学操作包含add、subtract、multiply、divide, log、sqrt等一系列函数 >>>a = np.array([1, 2, 3, 4, 5]) >>>b = np.array([6, 7, 8, 9, 10]) >>>np.add(a, b) array([ 7, 9, 11, 13, 15]) >>>np.subtract(b, a) array([5, 5, 5, 5, 5]) >>>a + b array([ 7, 9, 11, 13, 15]) >>>b - a array([5, 5, 5, 5, 5]) >>>np.log10(100) 2.0 >>> #如果先让结果覆盖原有数组,可以参考如下示例中的方式使用 >>>a = np.array([1, 2, 3], dtype=float) >>>b = np.sqrt(a) >>>print a [ 1. 2. 3.] >>>print b [ 1. 1.41421356 1.73205081] >>>c = np.sqrt(a, a) >>>print a [ 1. 1.41421356 1.73205081] >>>print c [ 1. 1.41421356 1.73205081] >>>id(a) == id(c) True >>> #内容:三角函数 >>> #包含sin、cos、tan等一些列函数。需要特别说明的是其参数并不直接代表三角 函数的度数,而是使用pi替代。其中 2pi相当于 360 度,所以np.sin(np.pi) = 1。>>>np.sin(np.pi / 2) 1.0 >>>np.sin(np.array((0.,30.,45.,60.,90.))*np.pi/180.) array([ 0., 0.5, 0.70710678, 0.8660254, 1.]) >>>np.cos(np.array([0, np.pi/2, np.pi])) array([ 1.00000000e+00, 6.12323400e-17, -1.00000000e+00]) >>> #内容:位操作函数 >>> #包含按位的与、或、异或、左移、右移等操作 >>>np.binary_repr(5) '101' >>>np.binary_repr(7) '111' >>>np.bitwise_and(5, 7) 5 >>>np.bitwise_or(5, 7) 7 >>>np.left_shift(5, 2) 20 >>>np.right_shift(5, 2) 1 >>> #内容:比较函数 >>> #包含了数值比较、逻辑运算、取最大值、取最小值等操作 >>>np.greater([1, 5], [2, 10]) array([False, False], dtype=bool) >>>np.greater_equal([4, 2, 1], [2, 2, 2]) array([ True, True, False], dtype=bool) >>>x = np.arange(5) >>>np.logical_and(x>1, x<4) array([False, False, True, True, False], dtype=bool) >>> #内容:浮点函数 >>> #包含了类型判别、是否是最大值、向上取整等操作 >>>np.iscomplex([3+1j, 6+0j, 7.5, 6, 2j]) array([ True, False, False, False, True], dtype=bool) >>>np.isinf(np.inf) True >>>a = np.array([2.1, -2.1, 3.54, 7,2, -7.2]) >>>np.ceil(a) array([ 3., -2., 4., 7., 2., -7.]) >>>np.floor(a) array([ 2., -3., 3., 7., 2., -8.])
(6)文件I/O
Numpy提供一些文件存取操作,方便将ndarray数组的元素存储到文件以及从文件读取数据来初始化数组。其中tofile、fromfile以二进制形式的方式存取;save、load函数以Numpy的专有格式存取;savez可以保存多个数组到同一个文件,并可以通过load循环取出。tofile, fomfile示例如下。
>>>a = np.array([1, 2, 3, 4, 5]) >>>print a.dtype int64 >>> #tofile、fromfile示例 >>>a.tofile("a.bin") >>>b = np.fromfile("a.bin", dtype = np.int64) >>>print b [1 2 3 4 5] >>> #save、load示例 >>>np.save("a.npy", a) >>>b= np.load( "a.npy" ) >>>print b [1 2 3 4 5] >>> # savez、load示例 >>>a = np.array([[1, 2, 3], [4, 5, 6]]) >>>b = np.array([1, 2, 3]) >>>c = np.array([1.2, 3.1, 3.3]) >>>np.savez("data.npz", a, b, c) >>>arr = np.load("data.npz") >>>arr["arr_0"] array([[1, 2, 3], [4, 5, 6]]) >>>arr["arr_1"] array([1, 2, 3]) >>>arr["arr_2"] array([ 1.2, 3.1, 3.3])