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

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

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

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

接下来介绍矩阵运算

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

matrix 对象

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

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

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

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

dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

两个三维数组相乘

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

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

 >>> np.alltrue( c[0,:,0,:] == np.dot(a[0],b[0]) )
True
>>> np.alltrue( c[1,:,0,:] == np.dot(a[1],b[0]) )
True
>>> np.alltrue( c[0,:,1,:] == np.dot(a[0],b[1]) )
True
>>> np.alltrue( c[1,:,1,:] == np.dot(a[1],b[1]) )
True
  • inner : 和dot乘积一样,对于两个一维数组,计算的是这两个数组对应下标元素的乘积和;对于多维数组,它计算的结果数组中的每个元素都是:数组a和b的最后一维的内积,因此数组a和b的最后一维的长度必须相同:

 inner(a, b)[i,j,k,m] = sum(a[i,j,:]*b[k,m,:])
 >>> a = np.arange(12).reshape(2,3,2)
>>> b = np.arange(12,24).reshape(2,3,2)
>>> c = np.inner(a,b)
>>> c.shape
(2, 3, 2, 3)
>>> c[0,0,0,0] == np.inner(a[0,0],b[0,0])
True
>>> c[0,1,1,0] == np.inner(a[0,1],b[1,0])
True
>>> c[1,2,1,2] == np.inner(a[1,2],b[1,2])
True
  • outer : 只按照一维数组进行计算,如果传入参数是多维数组,则先将此数组展平为一维数组之后再进行运算。outer乘积计算的列向量和行向量的矩阵乘积:

 >>> np.outer([1,2,3],[4,5,6,7])
array([[ 4, 5, 6, 7],
[ 8, 10, 12, 14],
[12, 15, 18, 21]])

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

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

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

最新文章

  1. iOS开发 适配iOS10以及Xcode8
  2. Log4net在类库中的用法
  3. Object C语法学习笔记(一)
  4. session过期时ajax请求刷新浏览器
  5. 穿越泥地(mud) (BFS)
  6. Linux进程间通信-命名管道
  7. Android 写文件到手机
  8. C# richTextBox编辑器
  9. citrix+netscaler配置第一次培训
  10. win7 绿色版MySQL安装与配置
  11. 10个原生JavaScript技巧
  12. tornado框架设置
  13. linux 之 shell
  14. mybatis:自动分页插件
  15. Python + Selenium操作一:截图详解
  16. day11- python生成式和生成器
  17. 【慕课网实战】Spark Streaming实时流处理项目实战笔记二之铭文升级版
  18. did not call through to super.onCreate()
  19. Android开发训练之第五章第五节——Resolving Cloud Save Conflicts
  20. POJ1038 Bugs Integrated, Inc.

热门文章

  1. centos7 配置 NFS mount挂载服务器
  2. python2 commands模块在python3.x被subprocess取代
  3. 使用wepy框架搭建微信小程序采坑记(一)
  4. springboot--常用注解--@configration、@Bean
  5. js 滚到页面顶部
  6. Linux环境安装xmapp(PHP-Mysql集成环境)
  7. dubbo 之filter使用
  8. jsp页面图片显示不出来
  9. vue和react
  10. VMWare的共享文件的安装指南