NumPy-快速处理数据--矩阵运算

本文摘自《用Python做科学计算》,版权归原作者所有。

1. NumPy-快速处理数据--ndarray对象--数组的创建和存取

2. NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构

3. NumPy-快速处理数据--ufunc运算--广播--ufunc方法

接下来介绍矩阵运算

Numpy默认不使用矩阵运算,如果希望对数组进行矩阵运算的话需要调用相应的函数

matrix 对象

numpy库提供了matrix类,使用matrix类创建的是矩阵对象,它们的加减乘除运算缺省采用矩阵方式计算,因此用法和matlab十分类似。但是由于NumPy中同时存在ndarray和matrix对象,因此用户很容易将两者弄混。这有违Python的“显式优于隐式”的原则,因此并不推荐在较复杂的程序中使用matrix。下面是使用matrix的一个例子:

 1 >>> import numpy as np
 2 >>> a = np.matrix([[1,2,3],[5,5,6],[7,9,9]])
 3 >>> a**-1     # a 的逆矩阵
 4 matrix([[-0.6       ,  0.6       , -0.2       ],
 5         [-0.2       , -0.8       ,  0.6       ],
 6         [ 0.66666667,  0.33333333, -0.33333333]])
 7 >>> a * a**-1 # a与a的逆矩阵的乘积,结果是单位阵
 8 matrix([[  1.00000000e+00,   0.00000000e+00,   0.00000000e+00],
 9         [  4.44089210e-16,   1.00000000e+00,   4.44089210e-16],
10         [  0.00000000e+00,  -4.44089210e-16,   1.00000000e+00]])

如果不使用matrix 对象,而把二维数组看作是矩阵的话,就需要使用dot函数进行计算。对于二维数组,它计算的是矩阵乘积,对于一维数组,它计算的是其点积。当需要将一维数组当作列矢量或者行矢量进行矩阵运算时,推荐先使用reshape或者shape函数将一维数组转换为二维数组:

 1 >>> a = np.array([1, 2, 3])
 2 >>> a.shape#a是一维数组
 3 (3,)
 4 >>> a.shape = (-1, 1)#使用shape直接修改a的维数
 5 >>> a
 6 array([[1],
 7        [2],
 8        [3]])
 9 >>> a.reshape(1, -1) #使用reshape也可以,但是他的返回值改变a的shape,而a本身不变
10 array([[1, 2, 3]])
11 >>> a
12 array([[1],
13        [2],
14        [3]])
  • dot :对于两个一维的数组,计算的是这两个数组对应下标元素的乘积和(数学上称之为内积);对于二维数组,计算的是两个数组的矩阵乘积;对于多维数组,它的通用计算公式如下,即结果数组中的每个元素都是:数组a的最后一维上的所有元素与数组b的倒数第二位上的所有元素的乘积和:
dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

两个三维数组相乘

 1 >>> a = np.arange(12).reshape(2,3,2)
 2 >>> a
 3 array([[[ 0,  1],
 4         [ 2,  3],
 5         [ 4,  5]],
 6
 7        [[ 6,  7],
 8         [ 8,  9],
 9         [10, 11]]])
10 >>> b = np.arange(12,24).reshape(2,2,3)
11 >>> b
12 array([[[12, 13, 14],
13         [15, 16, 17]],
14
15        [[18, 19, 20],
16         [21, 22, 23]]])
17 >>> c = np.dot(a,b)
18 >>> c
19 array([[[[ 15,  16,  17],
20          [ 21,  22,  23]],
21
22         [[ 69,  74,  79],
23          [ 99, 104, 109]],
24
25         [[123, 132, 141],
26          [177, 186, 195]]],
27
28
29        [[[177, 190, 203],
30          [255, 268, 281]],
31
32         [[231, 248, 265],
33          [333, 350, 367]],
34
35         [[285, 306, 327],
36          [411, 432, 453]]]])
37 >>> c.shape
38 (2, 3, 2, 3)

dot乘积的结果c可以看做是数组a, b的多个子矩阵的乘积:

1 >>> np.alltrue( c[0,:,0,:] == np.dot(a[0],b[0]) )
2 True
3 >>> np.alltrue( c[1,:,0,:] == np.dot(a[1],b[0]) )
4 True
5 >>> np.alltrue( c[0,:,1,:] == np.dot(a[0],b[1]) )
6 True
7 >>> np.alltrue( c[1,:,1,:] == np.dot(a[1],b[1]) )
8 True
  • inner : 和dot乘积一样,对于两个一维数组,计算的是这两个数组对应下标元素的乘积和;对于多维数组,它计算的结果数组中的每个元素都是:数组a和b的最后一维的内积,因此数组a和b的最后一维的长度必须相同:
1 inner(a, b)[i,j,k,m] = sum(a[i,j,:]*b[k,m,:])
 1 >>> a = np.arange(12).reshape(2,3,2)
 2 >>> b = np.arange(12,24).reshape(2,3,2)
 3 >>> c = np.inner(a,b)
 4 >>> c.shape
 5 (2, 3, 2, 3)
 6 >>> c[0,0,0,0] == np.inner(a[0,0],b[0,0])
 7 True
 8 >>> c[0,1,1,0] == np.inner(a[0,1],b[1,0])
 9 True
10 >>> c[1,2,1,2] == np.inner(a[1,2],b[1,2])
11 True
  • outer : 只按照一维数组进行计算,如果传入参数是多维数组,则先将此数组展平为一维数组之后再进行运算。outer乘积计算的列向量和行向量的矩阵乘积:
1 >>> np.outer([1,2,3],[4,5,6,7])
2 array([[ 4,  5,  6,  7],
3        [ 8, 10, 12, 14],
4        [12, 15, 18, 21]])

矩阵中更高级的一些运算可以在NumPy的线性代数子库linalg中找到。例如inv函数计算逆矩阵,solve函数可以求解多元一次方程组。下面是solve函数的一个例子:

1 >>> a = np.random.rand(10,10)
2 >>> b = np.random.rand(10)
3 >>> x = np.linalg.solve(a,b)

solve函数有两个参数a和b。a是一个N*N的二维数组,而b是一个长度为N的一维数组,solve函数找到一个长度为N的一维数组x,使得a和x的矩阵乘积正好等于b,数组x就是多元一次方程组的解。

时间: 2024-10-10 08:45:04

NumPy-快速处理数据--矩阵运算的相关文章

Numpy快速处理数据--多项式函数poly1d( )函数

多项式函数是变量的整数次冥与系数的乘积之和,可以用下面的公式表示: 如果f(x) = 2x2 +x +1 a= np.array([2,1,1]) p = np.poly1d(a) pOut[78]: poly1d([2, 1, 1])      #等同于2*x2  + 1* x1 +1*x0 = 2x2 + x +1 print(p) 2 x2 + 1 x + 1 带入值: p([1,2,3]) Out[80]: array([ 4, 11, 22]) 对poly1d( )对象进行加减乘除运算

Python科学计算:用NumPy快速处理数据

创建数组 import numpy as np a=np.array([1,2,3]) b=np.array([[1,2,3],[4,5,6],[7,8,9]]) b[1,1]=10 print(a.shape) print(b.shape) print(a.dtype) print(b) 结构数组 import numpy as np persontype=np.dtype({ "names":["name","age","chine

Python科学计算学习一 NumPy 快速处理数据

1 创建数组 (1) array(boject, dtype=None, copy=True, order=None, subok=False, ndmin=0) a = array([1, 2, 3, 4]) b = array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) a.dtype    --> dtype('int32') a.shape    --> (4,) b.shape    -->(3, 4) a.shape=2, -

使用Chrome快速实现数据的抓取(四)——优点

些一个抓取WEB页面的数据程序比较简单,大多数语言都有相应的HTTP库,一个简单的请求响应即可,程序发送Http请求给Web服务器,服务器返回HTML文件.交互方式如下: 在使用DevProtocol驱动Chrome抓取数据时,交互过程则如下图所示: 此时Chrome在中间充当了一个代理的角色,看上去变得更加复杂了,实际上却对于我们的蜘蛛程序大有帮助.本文就简单的总结下这种方式存在如下优点. 获取动态生成的网页内容 现在很多的网页内容的内容并不是一开是就能直接通过最初的Http请求直接获取到的,

快速创建数据大绝招

作为程序员,创建数据库,输入数据的时候,都会有个量的问题,少了好说,多了呢,上千上万条怎么办?一个个输入的话那不是要死人? 还好,咱有妙招,不多说了,直接进入正题:如何把word文件数据快速生成数据! 准备条件:word.Excel (我用的是wps,Excel使用上有点区别,一会介绍): 还有 EditPlus 说白了也就是EditPlus绝妙用法: 先看原来word文件数据是这样的 选中,复制出来=> 粘贴到EditPlus中,先预备好创建代码=> 同样的代码快速复制,请狠狠的按Ctrl+

MySQL中快速复制数据表方法汇总

本文将着重介绍两个MySQL命令的组合,它将以原有数据表为基础,创建相同结构和数据的新数据表. 这可以帮助你在开发过程中快速的复制表格作为测试数据,而不必冒险直接操作正在运行 的数据表. 示例如下: 将 production 数据库中的 mytbl 表快速复制为 mytbl_new,2个命令如下: CREATE TABLE mytbl_new LIKE production.mytbl; INSERT mytbl_new SELECT * FROM production.mytbl; 第一个命令

在ASP.NET Core中使用Apworks快速开发数据服务

不少关注我博客的朋友都知道我在2009年左右开发过一个名为Apworks的企业级应用程序开发框架,旨在为分布式企业系统软件开发提供面向领域驱动(DDD)的框架级别的解决方案,并对多种系统架构风格提供支持.这个框架的开发和维护我坚持了很久,一直到2015年,我都一直在不停地重构这个项目.目前这个项目在Github上也得到了将近260的推荐数,很多对技术感兴趣的朋友也一直与我保持着联系和交流,甚至还有爱好者自发组成了技术讨论群,专门讨论分享Apworks框架. 然而,随着软件开发技术和.NET的发展

KVC方法快速为数据对象赋值

利用KVC方法快速为数据对象赋值,如下例 在.h文件中声明如下形式方法: - (id)initWithDic:(NSDictionary *)dic; 在对应.m文件中 - (id)initWithDic:(NSDictionary *)dic { self = [super init]; if (self) { [self setValuesForKeysWithDictionary:dic]; } return self; } 同时实现下面方法 ,实现内容一般不写(必须实现,否则无法使用KV

使用Sql语句快速将数据表转换成实体类

开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare @TableName sysname = 'TableName' declare @Result varchar(max) = 'public class ' + @TableName + ' {' select @Result = @Result + ' public ' + ColumnType