Python绝技:运用Python成为顶级数据工程师
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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])