zoukankan      html  css  js  c++  java
  • Python数据分析工具库-Numpy 数组支持库(一)

    1 Numpy数组

    在Python中有类似数组功能的数据结构,比如list,但在数据量大时,list的运行速度便不尽如意,Numpy(Numerical Python)提供了真正的数组功能,以及对数据进行快速处理的函数,Numpy中内置函数处理数据的速度是C语言级别的。Numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy中的ndarray类提供了python对多维数组对象的支持,并具备对矢量进行运算的能力,运算更为快速且节省空间。

    ndarray是N维数组对象(矩阵),其中所有的元素都必须是相同类型。ndarray主要包含以下几个属性:

    ndarray.ndim:表示数组对象或矩阵的维度;

    ndarray.shape:表示每个维度上的数组的大小;

    ndarray.size:表示数组中元素的总数,等同于ndarray.shape中两个元素的乘积;

    ndarray.dtype:表示数组中元素的类型;

    ndarray.itemsize:表示数组中每个元素的字节大小,比如数据类型为float64的数组,其元素的字节大小为64/8=8。

    比如:

    >>> import numpy as np
    >>> a = np.arange(15).reshape(3, 5)
    >>> a
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    >>> a.shape
    (3, 5)
    >>> a.ndim
    2
    >>> a.dtype.name
    'int64'
    >>> a.itemsize
    8
    >>> a.size
    15
    >>> type(a)
    <type 'numpy.ndarray'>

    2 创建Numpy数组

    array方法

    >>> import numpy as np
    >>> a = np.array([2,3,4])#创建一维数组
    >>> b = np.array([(1.5,2,3), (4,5,6)])#创建二维数组
    >>> c = np.array( [ [1,2], [3,4] ], dtype=float64 )#创建指定数据类型的数组

    如果想创建指定shape的数组,并使用占位符来初始化数组,可以用以下方法:

    >>> np.zeros( (3,4) )#创建3行4列矩阵,用0初始化矩阵中所有的元素
    array([[ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.]])
    >>> np.ones( (2,3,4), dtype=np.int16 ) #创建三维矩阵,维度分别为2,3,4,且用1来初始化矩阵中所有的元素
    array([[[ 1, 1, 1, 1],
            [ 1, 1, 1, 1],
            [ 1, 1, 1, 1]],
           [[ 1, 1, 1, 1],
            [ 1, 1, 1, 1],
            [ 1, 1, 1, 1]]], dtype=int16)
    >>> np.empty( (2,3) ) #创建2行3列空矩阵,矩阵中元素初始值随机,取决于内存状态,默认情况下,创建的数组的dtype为float64。
    array([[  3.73603959e-262,   6.02658058e-154,   6.55490914e-260],
           [  5.30498948e-313,   3.14673309e-307,   1.00000000e+000]])

    对应的zeros、ones、empty还有zeros_like、ones_like、empty_like,它们以另一个数组为参数,根据其形状和dtype创建数组。

    arange方法,与Python内置的range相似:

    >>> numpy.arange(6)
    array([0,1,2,3,4,5,])
    >>> np.arange( 10, 30, 5 )
    array([10, 15, 20, 25])

    3 数组基本数学操作

    加、减、乘、点乘

    >>> a = np.array( [20,30,40,50] )
    >>> b = np.arange( 4 )
    >>> b
    array([0, 1, 2, 3])
    >>> c = a-b
    >>> c
    array([20, 29, 38, 47])
    >>> 10*np.sin(a)
    array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])
    >>> a<35
    array([ True, True, False, False])
    >>> A = np.array( [[1,1],
    ...             [0,1]] )
    >>> B = np.array( [[2,0],
    ...             [3,4]] )
    >>> A*B #矩阵相乘
    array([[2, 0],
           [0, 4]])
    >>> A.dot(B) #矩阵点乘
    array([[5, 4],
           [3, 4]])
    >>> np.dot(A, B)  #矩阵点乘
    array([[5, 4],
           [3, 4]])

    叠加、叠乘

    >>> a = np.ones((2,3), dtype=int)
    >>> b = np.random.random((2,3))
    >>> a *= 3
    >>> a
    array([[3, 3, 3],
           [3, 3, 3]])
    >>> b += a
    >>> b
    array([[ 3.417022  ,  3.72032449,  3.00011437],
           [ 3.30233257,  3.14675589,  3.09233859]])
    >>> a += b  #浮点型不能转换成整型
    TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int64') with casting rule 'same_kind'

    取最大、最小、求和

    >>> a = np.random.random((2,3))
    >>> a
    array([[ 0.18626021,  0.34556073,  0.39676747],
           [ 0.53881673,  0.41919451,  0.6852195 ]])
    >>> a.sum()
    2.5718191614547998
    >>> a.min()
    0.1862602113776709
    >>> a.max()
    0.6852195003967595

    对于多维矩阵,只在其中指定轴进行操作,使用axis参数

    >>> b = np.arange(12).reshape(3,4)
    >>> b
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>> b.sum(axis=0)   #对二维矩阵的列轴进行求和
    array([12, 15, 18, 21])
    >>> b.min(axis=1)  #求二维矩阵的每个横轴最小值
    array([0, 4, 8])

    通用函数(ufunc),对ndarray中的数据执行元素级运算,比如sin、cos、exp等:

    >>> B = np.arange(3)
    >>> B
    array([0, 1, 2])
    >>> np.exp(B)
    array([ 1.        ,  2.71828183,  7.3890561 ])
    >>> np.sqrt(B)
    array([ 0.        ,  1.        ,  1.41421356])
    >>> C = np.array([2., -1., 4.])
    >>> np.add(B, C)
    array([ 2.,  0.,  6.])

    4 数组的索引、切片和遍历

    和Python的list数据结构类似,Numpy的一维数组也可以进行索引、切片以及遍历。

    >>> a = np.arange(10)**3
    >>> a
    array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
    >>> a[2]
    8
    >>> a[2:5]
    array([ 8, 27, 64])
    >>> a[:6:2] = -1000    #从0-6的元素中,每隔2个将元素值重新赋值为-1000
    >>> a
    array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,   729])
    >>> for i in a:
    ...     print(i + 1)
    -999
    2
    -999
    28
    -999
    126
    217
    344
    513
    730

    二维数组的索引、切片:

    >>> def f(x,y):
    ...     return 10*x+y
    ...
    >>> b = np.fromfunction(f,(5,4),dtype=int) #函数式创建数组,fromfunction第一个参数为函数f,第二个参数为数组的shape,shape第一个参数为函数f第一个参数的取值范围,第二个参数为函数f第二个参数的取值范围,dtype表示数组元素类型。
    >>> b
    array([[ 0,  1,  2,  3],
           [10, 11, 12, 13],
           [20, 21, 22, 23],
           [30, 31, 32, 33],
           [40, 41, 42, 43]])
    >>> b[2,3] #不是数组b中的第2行第三列的元素,而是索引为[2,3]的元素
    23
    >>> b[0:5, 1]  #取出从第0行到第5行的第2个元素组成数组
    array([ 1, 11, 21, 31, 41])
    >>> b[ : ,1]  #等同于前一句
    array([ 1, 11, 21, 31, 41])
    >>> b[1:3, : ]  #取出第2行与第3行的所有元素组成数组
    array([[10, 11, 12, 13],
           [20, 21, 22, 23]])
    >>> for row in b: #遍历得到b数组的每一行元素
    ...     print(row)
    ...
    [0 1 2 3]
    [10 11 12 13]
    [20 21 22 23]
    [30 31 32 33]
    [40 41 42 43]
    >>> for element in b.flat: #遍历得到b数组的每一个元素
    ...     print(element)
    ...
    0
    1
    2
    3
    10
    11
    12
    13
    20
    21
    22
    23
    30
    31
    32
    33
    40
    41
    42
    43

    多维数组的索引、切片:

    >>> c = np.array( [[[  0,  1,  2],    
    ...                 [ 10, 12, 13]],
    ...                [[100,101,102],
    ...                 [110,112,113]]])
    >>> c.shape
    (2, 2, 3)
    >>> c[1,…]   #等同于 c[1,:,:] or c[1]
    array([[100, 101, 102],
           [110, 112, 113]])
    >>> c[...,2]   #等同于 c[:,:,2]
    array([[  2,  13],
           [102, 113]])

    厦门叉车服务专家

    参考文献

    Numpy API文档:https://docs.scipy.org/doc/

  • 相关阅读:
    编解码学习笔记(十):Ogg系列
    php大小写问题
    thinkphp5内置标签
    php递归实现无限级分类
    thinkphp5项目--企业单车网站(五)
    控制器不存在:appadmincontrollerDocument
    Cookie与Session的区别与联系及生命周期
    thinkphp5项目--企业单车网站(四)
    thinkphp5项目--企业单车网站(三)
    thinkphp使后台的字体图标显示异常
  • 原文地址:https://www.cnblogs.com/xyou/p/9103434.html
Copyright © 2011-2022 走看看