• Python机器学习(三十五)NumPy ndarray


    NumPy中最重要的类是ndarray,ndarray是存储单一数据类型的多维数组。

    可以使用索引(从0开始)访问ndarray对象中的元素。

    ndarray的内存结构

    标准的Python列表(list)中,元素是对象。如:L = [1, 2, 3],需要3个指针和三个整数对象,对于数值运算比较浪费资源。

    与此不同,ndarray中元素直接存储为原始数据,元素的类型由ndarray对象中的属性dtype描述。

    当ndarray数组中的元素,通过索引或切片返回时,会根据dtype,从原始数据转换成Python对象,以便外部使用。

    ndarray内存结构

    上图中,ndarray头部信息中的dtype描述了数组元素的数据类型,元素保存为原始数据(二进制数据),从数组中取出后,将根据dtype转换为相应的python对象。

    创建Ndarray对象

    要创建ndarray对象,可以使用numpy模块中的array构造函数。为此,首先需要导入numpy模块。

    >>> a = numpy.array  

    示例

    [root@qikegu py3]# python
    Python 3.7.3 (default, Jun 17 2019, 22:07:41)
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import numpy
    >>> a = numpy.array
    >>> print(a)
    <built-in function array>

    可以将集合对象传递给array函数,用于创建与集合对象内容相同的n维数组。语法如下所示:

    >>> numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)  

    下表是参数说明:

    序号参数描述
    1 object 表示集合对象,可以是列表、元组、字典、集合等等。
    2 dtype 可选。可以通过此项参数更改数组元素的类型,默认值是none,表示保持原集合对象中的类型。
    3 copy 可选参数。默认是true,表明复制对象。
    4 order {‘K’, ‘A’, ‘C’, ‘F’}, 可选参数。指定数组的内存布局,可以是C语言顺序(行)或Fortan语言顺序(列)。详情可参考官方文档。
    5 subok 布尔量,可选参数。默认false,表示须返回基类数组;如果设置为true,表示可以返回子类。
    6 ndmin 整型,可选。指定返回数组的最小维数。

    要使用Python列表创建ndarray数组,使用以下语句:

    a = numpy.array([1, 2, 3])  

    示例

    >>> a = numpy.array([1,2,3])
    >>> print(a)
    [1 2 3]

    要创建多维数组,可使用以下语句。

    a = numpy.array([[1, 2, 3], [4, 5, 6]]) 

    示例

    >>> a = numpy.array([[1, 2, 3], [4, 5, 6]])
    >>> print(a)
    [[1 2 3]
     [4 5 6]]

    要指定数组元素的数据类型,可以传入dtype参数。

    a = numpy.array([1, 3, 5, 7], complex)  

    示例

    指定数组元素为复数类型:

    >>> a = numpy.array([1, 3, 5, 7], complex)
    >>> print(a)
    [1.+0.j 3.+0.j 5.+0.j 7.+0.j]

    获取数组的维数

    ndarray.ndim属性可以用来获取数组的维数。

    示例

    >>> arr = numpy.array([[1, 2, 3, 4], [4, 5, 6, 7], [9, 10, 11, 23]])
    >>> print(arr.ndim)
    2 

    获取数组元素的大小

    ndarray.itemsize属性用于获取数组元素的大小,该函数返回数组元素的字节数。

    示例

    #获取数组元素的大小  
    import numpy as np  
    a = np.array([[1,2,3]])  
    print("数组元素大小:", a.itemsize, "字节")  

    输出

    数组元素大小: 8 字节

    获取数组元素的数据类型

    要检查数组元素的数据类型,可以使用ndarray.dtype属性。

    示例

    #检查数组元素的数据类型
    import numpy as np  
    a = np.array([[1,2,3]])  
    print("数据元素的数据类型是:", a.dtype)  

    输出

    数据元素的数据类型是: int64

    获取数组的形状和大小

    要获得数组的形状和大小,可以使用ndarray.sizendarray.shape属性。

    数组形状是指数组的行数和列数,如一个二维数组的形状是:2(行)x 3(列)

    示例

    import numpy as np  
    a = np.array([[1,2,3,4,5,6,7]])  
    print("大小:",a.size)  
    print("形状:",a.shape)  

    输出

    大小: 7
    形状: (1, 7)

    重构数组对象

    数组的形状指的是多维数组的行数和列数。numpy中,可以改变数组的形状,即数组的行列排布。

    ndarray.reshape()函数可用于重构数组。该函数接受新形状的行、列两个参数。

    例如,如下图所示,可以把3×2的数组改为2×3的数组。

    reshape

    示例

    import numpy as np  
    a = np.array([[1,2],[3,4],[5,6]])  
    print("原数组:")  
    print(a)  
    a=a.reshape(2,3)  
    print("改变后:")  
    print(a)

    输出

    原数组:
    [[1 2]
     [3 4]
     [5 6]]
    
    改变后:
    [[1 2 3]
     [4 5 6]]

    数组切片

    NumPy中,数组切片可以从数组中提取指定范围的数组元素。NumPy中的数组切片方法与python中的列表切片方法类似。

    切片语法

    arr_name[start: end: step]
    • [:]表示复制源列表
    • 负的index表示,从后往前。-1表示最后一个元素。
    >>> a = np.array([1,2,3,4,5,6,7,8,9])
    >>> print(a[:5])
    [1 2 3 4 5]
    >>> print(a[1:5:2])
    [2 4]

    关于数组切片,后续章节将有详细介绍。

    linspace

    linspace()函数的作用是: 返回给定区间内均匀分布的值。下面的示例,在给定的区间5-15内返回10个均匀分布的值

    示例

    import numpy as np  
    a=np.linspace(5,15,10) #打印10个值,这些值在给定的区间5-15上均匀地分布
    print(a)  

    输出

    [ 5.          6.11111111  7.22222222  8.33333333  9.44444444 10.55555556
     11.66666667 12.77777778 13.88888889 15.        ]

    获取数组元素中的最大值、最小值以及元素的和

    ndarray.max()ndarray.min()ndarray.sum()函数,分别用于获取数组元素中的最大值、最小值以及元素和。

    示例

    import numpy as np  
    a = np.array([1,2,3,10,15,4])  
    print("数组:",a)  
    print("最大值:",a.max())  
    print("最小值:",a.min())  
    print("元素总和:",a.sum())   

    输出

    数组: [ 1  2  3 10 15  4]
    最大值: 15
    最小值: 1
    元素总和: 35

    NumPy数组轴

    NumPy多维数组由轴表示,其中axis-0表示列,axis-1表示行。我们可以通过轴对列或行进行计算。例如,求某行元素的和。

    NumPy axis

    示例

    计算每一列中的最大元素、每一行中的最小元素,以及每一行的和:

    import numpy as np  
    a = np.array([[1,2,30],[10,15,4]])  
    print("数组:",a)  
    print("每列的最大元素:",a.max(axis = 0))   
    print("每行的最小元素:",a.min(axis = 1))  
    print("每行的和:",a.sum(axis = 1))  

    输出

    数组: [[ 1  2 30]
     [10 15  4]]
    每列的最大元素: [10 15 30]
    每行的最小元素: [1 4]
    每行的和: [33 29]

    求平方根和标准差

    NumPy中,sqrt()std()函数分别求数组元素的平方根和标准差。

    标准差表示数组的每个元素与numpy数组的平均值之间的差异。

    示例

    import numpy as np  
    a = np.array([[1,2,30],[10,15,4]])  
    print(np.sqrt(a))  
    print(np.std(a)) 

    输出

    [[1.         1.41421356 5.47722558]
     [3.16227766 3.87298335 2.        ]]
    10.044346115546242

    数组间的算术运算

    numpy中,多维数组间可以直接进行算术运算。

    在下面的示例中,对两个多维数组a和b执行算术运算。

    示例

    import numpy as np  
    a = np.array([[1,2,30],[10,15,4]])  
    b = np.array([[1,2,3],[12, 19, 29]])  
    print("a+b
    ",a+b)  
    print("axb
    ",a*b)  
    print("a/b
    ",a/b)  

    输出

    a+b
     [[ 2  4 33]
     [22 34 33]]
    axb
     [[  1   4  90]
     [120 285 116]]
    a/b
     [[ 1.          1.         10.        ]
     [ 0.83333333  0.78947368  0.13793103]]

    数组拼接

    numpy中,可以垂直或水平拼接2个数组。

    示例

    import numpy as np  
    a = np.array([[1,2,30],[10,15,4]])  
    b = np.array([[1,2,3],[12, 19, 29]])  
    print("垂直拼接
    ",np.vstack((a,b)));  
    print("水平拼接
    ",np.hstack((a,b)))  

    输出

    垂直拼接
     [[ 1  2 30]
     [10 15  4]
     [ 1  2  3]
     [12 19 29]]
    水平拼接
     [[ 1  2 30  1  2  3]
     [10 15  4 12 19 29]]
  • 相关阅读:
    Reverse Words in a String II -- LeetCode
    计算两点间的距离,hdu-2001
    A + B Problem,hdu-1000
    ASCII码排序,hdu-2000
    定义#define
    break语句的使用
    判断一个数是否为素数
    用下面公式求π:
    Sum Problem-hdu-1001
    正三角形的外接圆面积,nyoj-274
  • 原文地址:https://www.cnblogs.com/huanghanyu/p/13159113.html
Copyright © 2020-2023  润新知