细说NumPy数组的四种乘法的使用


Posted in Python onDecember 18, 2020

当孔乙己说回字有四样写法的时候,相信各位都是这样的表情吧?

细说NumPy数组的四种乘法的使用

但是,如果孔乙己说NumPy数组有四种乘法的时候,各位大约就是这样的表情了吧?

细说NumPy数组的四种乘法的使用

实际上,NumPy数组乘法远不止四种。为了在写作和阅读时保持清晰的逻辑和清醒的头脑,本文仅对四种最常见的数组乘法给出详细说明,并用一道数学题来演示向量点乘和叉乘的用法。

1. 星乘(*)

先声明一下:星乘这个说法,是我自己创造的,因为我实在不知道数组的这种乘法有没有其他高大上的名字,只好用运算符来表示了。所谓数组星乘,就是数组的对应元素相乘,这也是初学NumPy的同学最早接触到的数组乘法。

>>> import numpy as np
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> a*b
array([ 4, 10, 18])

对于多维数组,星乘的规则也是一样。

>>> a = np.arange(6).reshape((2,3))
>>> b = np.arange(6,12).reshape((2,3))
>>> a
array([[0, 1, 2],
    [3, 4, 5]])
>>> b
array([[ 6, 7, 8],
    [ 9, 10, 11]])
>>> a*b
array([[ 0, 7, 16],
    [27, 40, 55]])

即使两个数组的shape不一样,只要满足特定条件,同样可以用星号相乘,且满足交换律。

>>> a = np.arange(6).reshape((2,3))
>>> b = np.array([1,2,3])
>>> a
array([[0, 1, 2],
    [3, 4, 5]])
>>> b
array([1, 2, 3])
>>> a*b
array([[ 0, 2, 6],
    [ 3, 8, 15]])
>>> b*a
array([[ 0, 2, 6],
    [ 3, 8, 15]])

2. 点乘(np.dot)

在数学上,向量点乘就是两个向量的对应位相乘后求和,因此向量点乘得到的是标量。

细说NumPy数组的四种乘法的使用

向量点乘的几何意义是两个向量的模之积再乘以二者夹角的余弦值。这意味着,如果两个向量互相垂直,则其点积为零。反过来说,两个不为零的向量的点积等于零,则两个向量垂直。

numpy.dot()函数提供了点乘运算。对于一维数组,NumPy的点乘就是向量点乘,其结果是一个标量。对于多维数组,则需要满足一定条件才能实现点乘,且其结果不再是标量,而是一个多维数组。比如,NumPy的矩阵相乘,就是二维数组的点乘,参与点乘的第一个数组的列数必须等于第二个数组的行数。

细说NumPy数组的四种乘法的使用

>>> a = np.array([1,0,0])
>>> b = np.array([0,1,0])
>>> np.dot(a,b) # 向量a和向量b相互垂直,其点积为0
0
>>> a = np.arange(6).reshape((2,3))
>>> b = np.arange(6,18).reshape((3,4))
>>> np.dot(a,b) # 满足点乘条件
array([[ 38, 41, 44, 47],
    [128, 140, 152, 164]])
>>> np.dot(b,a) # 不满足点乘条件
Traceback (most recent call last):
 File "<pyshell#38>", line 1, in <module>
  np.dot(b,a)
 File "<__array_function__ internals>", line 6, in dot
ValueError: shapes (3,4) and (2,3) not aligned: 4 (dim 1) != 2 (dim 0)

3. 叉乘(np.cross)

在百度和知乎上,有很多人说叉积就是外积,也有人提出不同意见。我在这里仅使用叉乘或叉积等确定无误的概念,以免误人子弟。在数学上,二维平面的向量叉乘,其结果是以两个向量为边的菱形的面积,三维空间的向量叉乘,其结果是仍然是一个向量,且垂直于相乘的两个向量,也就是参与相乘的两个向量决定的平面的法向量。nunpy.cross()函数可以实现向量(一维数组)叉乘,也可以实现二维或三维数组的叉乘。

>>> a = np.array([2,0])
>>> b = np.array([2,2])
>>> np.cross(a,b) # 平面向量叉乘,其结果是以两个向量为边的菱形的面积
array(4)
>>> a = np.array([1,0,0])
>>> b = np.array([0,1,0])
>>> np.cross(a,b) # x轴叉乘y轴,得到z轴
array([0, 0, 1])
>>> np.cross(b,a) # 叉乘交换顺序,得到反向的法向量
array([ 0, 0, -1])

4. 外乘(np.outer)

这里的外乘,类似于星乘,并不是通用的概念,也是我自己编造的一个说法,来源于numpy.outer()函数。从字面看,outer()函数更像是求外积,但从实际效果看,更像是笛卡尔直积,因此我这里用了“外乘”而不是“外积”。那么,outer()函数究竟能作什么呢?

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

数组A外乘数组B,返回一个二维数组,这个二维数组的第i行是数组A的第i个元素星乘数组B。

5. 判断两条直线是否相交

假设abcd是欧氏空间中不重合的四个点,如何判断过点ab的直线和过点cd的直线是否相交?如果使用空间解析几何的方式来解决问题,对于一般程序员来说将是一个难题。不过,如果你熟悉NumPy,理解点积(np.dot)和叉积(np.cross)的话,解决这个问题就变得非常容易了。具体思路是这样的:

计算向量ab和向量cd的叉积,得到向量orth如果orth的每一个元素都是零,则表示直线ab平行于直线cd,二者不可能相交;否则,orth就同时垂直于向量ab和向量cd计算向量orth和向量ac的点积,得到标量dp如果dp为零,表示向量orth垂直于向量ac,此时直线ab和直线cd在同一个平面上,且一定相交于某点

以上思路写成代码如下。

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

到此这篇关于细说NumPy数组的四种乘法的使用的文章就介绍到这了,更多相关NumPy数组乘法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 开发Activex组件方法
Nov 08 Python
Python中有趣在__call__函数
Jun 21 Python
python实现判断数组是否包含指定元素的方法
Jul 15 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
Python退火算法在高次方程的应用
Jul 26 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
详解Django的CSRF认证实现
Oct 09 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
爬虫代理池Python3WebSpider源代码测试过程解析
Dec 20 Python
Python3 selenium 实现QQ群接龙自动化功能
Apr 17 Python
python 线程的五个状态
Sep 22 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 Python
如何通过python检查文件是否被占用
Dec 18 #Python
python 实现端口扫描工具
Dec 18 #Python
Python-split()函数实例用法讲解
Dec 18 #Python
Python+Opencv实现把图片、视频互转的示例
Dec 17 #Python
python 利用jieba.analyse进行 关键词提取
Dec 17 #Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 #Python
python 实现一个简单的线性回归案例
Dec 17 #Python
You might like
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
提升PHP速度全攻略
2006/10/09 PHP
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
2014/05/15 Javascript
Javascript Memoizer浅析
2014/10/16 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
python实现二分查找算法
2020/09/18 Python
python 高阶函数简单介绍
2021/02/19 Python
浅谈CSS3中display属性的Flex布局的方法
2017/08/14 HTML / CSS
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
大家检讨书5000字
2014/02/03 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
运动会广播稿100字
2014/09/14 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
银行贷款委托书范本
2014/10/11 职场文书
门店店长岗位职责
2015/04/14 职场文书