numpy库

    xiaoxiao2021-04-18  72

    【Python科学计算(1)】 - Numpy库¶

    Numpy是高性能科学计算和数据分析的基础包。

    Numpy本身并没有提供多么高级的数据分析功能,理解 Numpuy 数组以及面向数组的计算将有助于你更加搞笑的使用诸如 pandas 之类的工具,如果你是Python新手,而且只是想随意处理一下数据就行,那就跳过本节吧,没关系的。

    一、ndarray数组基础¶

    Pyhton 中用列表保存一组值,可将列表当成是数组使用。此外,Python 有 array 模快,但他不支持多维数组,无论是列表还是 array 模块都没有科学运算函数,不适合做矩阵等科学计算。因此,Numpy没有使用 Python 本身的数组机制,而是提供了 ndarray 数组对象,该对象不断能方便的存取数组,而且拥有丰富的数组计算函数,比如向量的加法、剪发、乘法等。

    使用 ndarray 数组,首先需要导入 Numpy 函数库,也可以直接导入该函数库:

    In [1]: from numpy import *

    或指定导入库的别名(在引入多个库的时候,推荐使用这个方法)。

    In [4]: import numpy as np

    下面正式进入Numpy的数组世界。如果没有说明,所称数组均为 Numpy 数组对象,与 Python 的列表和 array模块无关。

    1.1 创建数组¶

    创建数组是进行数组计算的先决条件,可以通过array()函数定义数组实例对象,其参数为Python 的序列对象(比如列表。)如果想定义多为数组,则传递多层嵌套的序列。例如下面这条语句定义了一个二维数组,其大小为(2,3),即有2行,3列。

    In [8]: a = np.array([[1,2,4.0],[3,6,9]]) a Out[8]: array([[ 1., 2., 4.], [ 3., 6., 9.]])

    接着我们看下数组的一些属性:

    In [5]: # 查看行数 a.ndim Out[5]: 2 In [6]: # 查看数组的维数,返回(n,m), 其中 n 为行数,m 为列数。 a.shape Out[6]: (2, 3) In [9]: # 查看元素的类型,比如 numpy.int32、numpy.float64 a.dtype Out[9]: dtype('float64')

    1.2 特殊数组¶

    Numpy的特殊数字主要有一下几种:

    zeros数组:全零数组,元素全为0;ones数组:全1数组,元素全为1;empty数组:空数组,元素全近似为0;

    下面是全零、全1、空数组的创建方法:

    In [10]: np.zeros((2,3)) Out[10]: array([[ 0., 0., 0.], [ 0., 0., 0.]]) In [18]: np.ones((3,4)) Out[18]: array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]]) In [26]: np.empty((3,2)) Out[26]: array([[ 0., 0.], [ 0., 0.], [ 0., 0.]])

    1.3 序列数组¶

    arange函数:他与 Python 的 range 函数相似,但他属于Numpy 库,其参数依次为:开始值、结束值、步长。

    In [22]: np.arange(1,20,5) Out[22]: array([ 1, 6, 11, 16])

    我们还可以使用 linspace 函数创建等差序列数组,其参数依次为:开始值、结束值、元素数量。

    In [23]: np.linspace(0,2,9) Out[23]: array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])

    1.4 数组索引¶

    Numpy 数组的每个元素、每行元素、每列元素都可以用索引访问,不过注意:索引是从 0 开始的。

    其操作与列表基本相同。

    In [27]: a = np.array([[1,2,4.0],[3,6,9]]) In [31]: # 取 a 的第一行元素 a[0] Out[31]: array([ 1., 2., 4.]) In [34]: # 取 a 的第二列元素 a[:,1] Out[34]: array([ 2., 6.]) In [36]: # 取 a 的第一行的第三个元素 a[0,2] Out[36]: 4.0

    1.5 数组运算¶

    In [40]: a = np.array([1,2,3]) b = np.array([4.,5,6]) In [39]: # 加法运算 a + b Out[39]: array([ 5., 7., 9.]) In [41]: # 减法运算 a - b Out[41]: array([-3., -3., -3.]) In [42]: # 乘法运算 a * b Out[42]: array([ 4., 10., 18.]) In [43]: # 乘方运算:a的2次方 a ** 2 Out[43]: array([1, 4, 9]) In [44]: # 除法运算 a/b Out[44]: array([ 0.25, 0.4 , 0.5 ]) In [47]: # 数组点乘 np.dot(a,b) Out[47]: 32.0 In [49]: # 判断大小,返回 bool 值 a >= 2 Out[49]: array([False, True, True], dtype=bool) In [50]: # a中最大的元素 a.max() Out[50]: 3 In [51]: # a中最小的元素 a.min() Out[51]: 1 In [52]: # a的和 a.sum() Out[52]: 6

    1.6 数组拷贝¶

    数组的拷贝分为浅拷贝和深拷贝两种,浅拷贝通过数组变量的复制完成,深拷贝使用数组对象的copy方法完成。

    浅拷贝值拷贝数组的引用,如果对拷贝对象修改。原数组也将修改。

    下面的代码演示了浅拷贝的方法:

    In [3]: a = np.ones((2,3)) a Out[3]: array([[ 1., 1., 1.], [ 1., 1., 1.]]) In [5]: # b 为 a 的浅拷贝 b = a b Out[5]: array([[ 1., 1., 1.], [ 1., 1., 1.]]) In [6]: # 对比进行修改,a也会被修改 b[1,2] = 9 a Out[6]: array([[ 1., 1., 1.], [ 1., 1., 9.]])

    深拷贝会复制一份和原数组一样的数组,但他们在内存中是分开存放的,所以改变拷贝数组,原数组不会改变。

    下面的代码演示了 b 使用 copy 方法从原数组 a 复制一份拷贝的情况。

    In [7]: a = np.ones((2,3)) a Out[7]: array([[ 1., 1., 1.], [ 1., 1., 1.]]) In [8]: b = a.copy() In [9]: b[1,2] = 9 b Out[9]: array([[ 1., 1., 1.], [ 1., 1., 9.]]) In [10]: a Out[10]: array([[ 1., 1., 1.], [ 1., 1., 1.]])

    二、矩阵¶

    2.1 创建矩阵¶

    Numpy的矩阵对象与数组对象相似,主要不同之处在于,矩阵对象的计算遵循矩阵数学运算规律。矩阵使用 matrix 函数创建,以(2,2)大小的矩阵为例(2行2列),定义方法如下:

    In [14]: A = np.matrix([[1.0,2.0],[3.0,4.0]]) A Out[14]: matrix([[ 1., 2.], [ 3., 4.]]) In [15]: # 查看A的类型 type(A) Out[15]: numpy.matrixlib.defmatrix.matrix

    2.2 矩阵运算¶

    矩阵的常用数学运算有转置、乘法、求逆等。下面的代码演示了矩阵的基本运算。

    In [16]: # 转置 A.T Out[16]: matrix([[ 1., 3.], [ 2., 4.]]) In [21]: B = np.matrix([[3.0],[5.0]]) B Out[21]: matrix([[ 3.], [ 5.]]) In [23]: # 矩阵乘法 A * B Out[23]: matrix([[ 13.], [ 29.]]) In [24]: # 逆矩阵 A.I Out[24]: matrix([[-2. , 1. ], [ 1.5, -0.5]]) In [26]: # 解线性方程组 solve(A, B) Out[26]: matrix([[-1.], [ 2.]])

    有关 Numpy 的东西就讲到这里了,接下来让我们学习激动人心的 pandas ~~~

    In [ ]:
    转载请注明原文地址: https://ju.6miu.com/read-675194.html

    最新回复(0)