细说NumPy数组的四种乘法的使用
作者:天元浪子 发布时间:2023-08-16 10:33:28
当孔乙己说回字有四样写法的时候,相信各位都是这样的表情吧?
但是,如果孔乙己说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.dot()函数提供了点乘运算。对于一维数组,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]])
来源:https://xufive.blog.csdn.net/article/details/110817562
猜你喜欢
- 在使用tensorflow时常常会使用到tf.reduce_*这类的函数,在此对一些常见的函数进行汇总1.tf.reduce_sumtf.r
- 自动签到的python脚本源码新建一个python文件,checkin.py,保存到电脑上某个位置,我这里保存到的是E:\pyproject
- 前言:大部分的文件上传功能都是用input标签实现,这样就完全可以把它看作一个输入框,可以通过send_keys()指定文件进行上传了。本章
- 概要相信很多像我一样初入门前端的时候,都是基于某个模板来学。 vue-element-admin 或者 vue-element-templa
- 概述:本控件使用 html+css+javascript模拟HTML内置的select元素,实现其部分方法与属性,也增加了一部分功能,并且从
- MySQL 5.7.9版本sql_mode=only_full_group_by问题用到GROUP BY 语句查询时com.MySQL.jd
- 应用场景域名资产监控,通过输入一个主域名,找到该域名对应的ip地址所在的服务器的端口开闭情况。通过定期做这样的监控,有助于让自己知道自己的资
- 通常操作系统和软件开发包中都包含文本编辑器,可以用来编辑配置文件,文档文件和源代码。下面是笔者总结的10个最好的免费代码文本编辑器:1.NO
- 一、前言传统上,开发人员在 JavaScript 类中为实例中可能需要的任何数据创建属性。对于在构造函数中随时可用的小块数据来说,这不是问题
- Ajax(Asynchronous Javascript And XML)翻译成英文就是“异步Javascript和XML”。即用Javas
- 事件捕捉(Event Capture)的实现问题 W3C DOM Level2的事件模型规范中,事件在DOM树中的传播过程(从根节点到目标节
- 本文实例讲述了Python实现绘制双柱状图并显示数值功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-#!
- 现象:在IE下,用JS修改p标签的innerHTML时,出"未知的运行时错误(unknown runtime error)&quo
- 最近刚换工作不久,没太多的时间去整理工作中的东西,大部分时间都在用来熟悉新公司的业务,熟悉他们的代码框架了,最主要的是还有很多新东西要学,我
- 模式特点:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。我们来看一下下面这样的程序结构:c
- 一、为什么要搭建爬虫代理池在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制,即在某一时间段内,当某个ip的访问次数达到一定的阀值时
- 以下是IE7中新支持的属性:min-height,max-height,min-width,max-width这个hack还可以使最大高度兼
- RSA算法RSA算法是一种公钥加密技术,被认为是最安全的加密方式.它是由Rivest,Shamir和Adleman于1978年发明的,因此命
- 本文实例为大家分享了python多进程共享变量的相关代码,供大家参考,具体内容如下from multiprocessing import P
- 挺久没写博客了,因为博主开始了今年另一段美好的实习经历,学习加做项目,时间已排满;很感谢今年这两段经历,让我接触了golang和python