1. 问题

ndarray 是 NumPy 的基础元素,NumPy 又主要是用来进行矩阵运算的。那么具体来说,ndarray 是如何进行普通矩阵运算的呢?

2. 分析

首先,在矩阵用 +-*/ 这些常规操作符操作的时候,是对元素进行操作。这和其他诸如 MATLAB 等语言不一样。

比如

ar = np.array([[20, 21, 22],[23, 24, 25]])
ar * ar

结果输出

array([[400, 441, 484],[529, 576, 625]])

可见, * 并没有进行矩阵乘法,而是矩阵和矩阵的元素进行了相乘。想要进行矩阵乘法计算,需要用dot方法

ar3 = np.array([[1, 2, 3],[4, 5, 6],[3, 2, 1]])
ar3.dot(ar3)

结果输出

array([[18, 18, 18],[42, 45, 48],[14, 18, 22]])
ar3 * ar3

结果输出

array([[ 1,  4,  9],[16, 25, 36],[ 9,  4,  1]])

那不同维数的矩阵如何处理?比如一个二维矩阵和一维向量,如何操作?这就需要用到 NumPy 的 Broadcasting 功能。Broadcasting 可以把低维矩阵扩展成高维矩阵进行运算。比如最简单的矩阵和数字相加,其实就等于把数字扩展成了一个和矩阵等大的新矩阵,然后对应元素相加。

Broadcasting 规则很简单

In order to broadcast, the size of the trailing axes for both arrays in an operation must either be the same size or one of them must be one.Array Broadcasting in Numpy — NumPy v1.19.dev0 Manual

即,Broadcasting 的时候,需要两个矩阵的尾轴大小相等,或者其中一个是 1。

这么说有点枯燥,举例如下

ar = np.array([[20, 21, 22],[23, 24, 25]])
t = array([1, 2, 3])
h = array([1, 2])ar / t

结果输出

array([[30.        , 15.5       , 10.66666667],[33.        , 17.        , 11.66666667]])ar / h
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-21-711a92d431f2> in <module>
----> 1 ar / hValueError: operands could not be broadcast together with shapes (2,3) (2,)

t 和 h 都是只有一个维度,所以其大小就等于尾维。t 的尾轴大小为3,ar 是 2x3,尾轴也是3,两者相等,可以计算。h 的尾轴大小为2,两者不等,所以出现错误。

其 Broadcasting 可以理解为

axis 1 fix+------------>
ar [20, 21, 22]   /      | t [1, 2, 3][23, 24, 25]     axis |   [1, 2, 3]0    |v broadcast by axis 0

可见,把 t 扩展成和 ar 一样大小后,两者在元素级别上对应相除,即可得到之前的结果。

3. 扩展

刚才提到了 NumPy 的轴,可以进一步扩展一下。轴在 NumPy里面通常用参数axis传递,比如 axis=0

NumPy 的坐标轴可以用下图来表示

axis 1+--------------->|       0     1     2|     +----+-----+----+
axis 0  |  0  |0,0 | 0,1 | 0,2||     +---------------+|  1  |1,0 | 1,1 | 1,2||     +---------------+v  2  |2,0 | 2,1 | 2,2|+----+-----+----+

当我们指定某一参数的时候,就可以理解成沿着这个方向执行操作。比如

Input: ar = np.arange(6).reshape(2,3)
Output:    array([[0, 1, 2],[3, 4, 5]])Input: np.sum(ar, axis=0)
Output:    array([3, 5, 7])Input: np.sum(ar, axis=1)
Output:    array([ 3, 12])

可见,当指定 axis=0 时,求和会沿着0轴方向进行,最后形成一个三个数字的向量;当指定 axis=1 时,求和会沿着1轴方向进行,最后形成一个两个数字的向量。

4. 总结

今天我们大致总结了 NumPy 的运算规则及坐标轴的含义。NumPy 作为基本库,是诸如 pandas、scikit-learn 等库的基础,掌握 NumPy 的相关规则,应是基本功。

相关代码均已上传到 Data2Science@Github (https://github.com/jetorz/Data2Science),欢迎标记 Star。

5. 交流

独学而无友则孤陋寡闻。现有「数据与统计科学」微信交流群,内有数据行业资深从业人员、海外博士、硕士等,欢迎对数据科学、数据分析、机器学习、人工智能有兴趣的朋友加入,一起学习讨论。

大家可以扫描下面二维码,添加荔姐微信邀请加入,暗号:机器学习加群。

6. 扩展

6.1. 延伸阅读

  1. Numpy 中如何对矩阵的特征对排序
  2. Python 中怎样合并数据

6.2. 参考文献

  1. [1]M. Wes, Python for Data Analysis, 2nd. Beijing: O’Reilly, 2017.
  2. [1]J. VanderPlas, Python Data Science Handbook. Beijing: O’Reilly, 2016.

numpy 矩阵乘法_NumPy 运算规则总结相关推荐

  1. numpy矩阵乘法_NumPy矩阵乘法

    numpy矩阵乘法 NumPy matrix multiplication can be done by the following three methods. NumPy矩阵乘法可以通过以下三种方 ...

  2. numpy 矩阵乘法_一起学习Python常用模块——numpy

    关注微信公众号:一个数据人的自留地 作者介绍 知乎@王多鱼 百度的一名推荐算法攻城狮. 主要负责商品推荐的召回和排序模型的优化工作. 1 前言 Python在数据科学.机器学习.AI领等域中占据主导地 ...

  3. numpy 矩阵拼接_Numpy学习笔记(下篇)

    Numpy学习笔记(下篇) [TOC] 路漫漫其修远兮,吾将上下而求索!Numpy学习笔记(上篇) 一.Numpy数组的合并与分割操作 ​ 在机器学习算法的使用中会经常使用这两种操作. 1.合并操作 ...

  4. python numpy 矩阵乘法以及列向量与行向量乘法

    最近在熟悉python的科学计算,对于numpy的矩阵运算进行一些总结,和matlab还是很不一样的 import numpy as np 1.矩阵乘法 np.dot(a,b),但a,b都为一维矩阵的 ...

  5. matlab 和 numpy 矩阵乘法异同

    最近在用python做一点东西,发现python下面的矩阵运算和matlab是不同的,虽然之前找到了一个关于MATLAB与python在数学运算方面指令的对照表,但是感觉还是不够详细. 对照表链接:h ...

  6. numpy矩阵乘法中的multiply,matmul和dot

    用numpy做矩阵运算时,少不了用到矩阵乘法.本文帮你迅速区分multiply, matmul和dot的区别. numpy官方文档中的说明:(想深入了解可以一戳) multiply: https:// ...

  7. python矩阵乘法 点乘_转(matlab和numpy矩阵乘法异同)

    广义的矩阵的矩阵乘法包括:矩阵相乘,矩阵点乘,向量乘法与向量点乘,内积. 对应的MATLAB有[* , .* , dot]三种运算符.分别表示的相乘,点乘和内积. 而在numpy中呢,也有*和dot两 ...

  8. numpy矩阵乘法的解惑

    #源码如下: 批量梯度下降法 import numpy as np # Setting a random seed, feel free to change it and see different ...

  9. python numpy矩阵索引_Numpy中的矩阵索引

    索引后查看形状:In [295]: A=np.matrix([1,2,3]) In [296]: A.shape Out[296]: (1, 3) In [297]: A[0] Out[297]: m ...

最新文章

  1. Oracle针对SCOTT下EMP表的练习题
  2. Class.forName( )你搞懂了吗?——转
  3. 打破校史!这位参与发表学校首篇Science的博士小姐姐,近日一作再发Nature
  4. SimulatorXcode模拟器如何使用PC键盘进行输入
  5. how does gateway framework treat default system flag in customizing
  6. Linux 命令简单介绍第二课笔记
  7. Mysql中几种插入效率的实例对比
  8. STM32那点事(4)_DMA(下)
  9. JVM内存模型、逃逸分析以及发生GC的时机
  10. 【报告分享】2021四大行业品牌蓝V社媒内容运营观察报告.pdf(附下载链接)
  11. 推送技术 Push Notification
  12. 规律、逻辑规律与悖论
  13. 【原创】修复ios输入框获取焦点时不支持fixed的bug
  14. PlusWell FileMirror软件产品简介
  15. android 将鼠标右键点击事件改为点击后返回功能
  16. 嵌入式研发人员核心竞争力分析
  17. 模拟人生java版攻略_模拟人生免费版简易攻略小技巧
  18. MYSQL数据库版本更新
  19. Java8 Lamda和Stream流你真的会用了嘛?
  20. SpringBoot + MyBatis + MySQL +IDEA2021 增删改查 2021-06-04

热门文章

  1. 第二代电子计算机逻辑部件主要由,计算机组成原理参考答案
  2. html5 页面答题算分,JavaScript实现答题评分功能页面
  3. 阿里云服务器mysql内存限制_高性能的MySQL(8)优化服务器配置一内存
  4. 设计模式之代理:手动实现动态代理,揭秘原理实现
  5. linux中循环创建文件,linux-尝试创建一个文件以调用另一个文件进行循环搜索
  6. js文件中使用jstl或者其他标签
  7. leetcode题解62-不同路径
  8. TensorFlow——tf.contrib.layers库中的相关API
  9. 03 验证合法性连接的客户端
  10. 646. Maximum Length of Pair Chain 最长的链条长度