【深度学习】numpy.dot(a, b)点乘运算

简介: 今天学习 python 里的 numpy 库里的 dot 方法,花了点功夫。

前言


今天学习 python 里的 numpy 库里的 dot 方法,花了点功夫。


正文


这是我练习的代码:


import numpy as np
x = np.array([
    [1, 2],
    [3, 4]
])
y = np.array([
    [5, 6],
    [7, 8]
])
v = np.array([9, 10])
w = np.array([11, 12])
print(np.dot(v, w))
print(v.dot(w))
print(np.dot(x, y))
print(x.dot(y))


这是执行结果:


219
219
[[19 22]
 [43 50]]
[[19 22]
 [43 50]]


让我郁闷的地方:x、y 是两个二维数组,v、w 是两个一维数组。np.dot(v, w) 和 v.dot(w) 是同一个效果,都表示 v 点乘 w。


  • 219 怎么来的?
    心中暗暗思忖:219 = 9 x 11 + 10 x 12。
  • [[19, 22], [43, 50]] 怎么来的?
    顺着上个问题,心中继续暗暗思忖:不就是对应元素相乘嘛,那么 [[19, 22], [43, 50]] = [[1 x 5, 2 x 6], [3 x 7, 4 x 8]]。核对的时候,发现并不是这么玩的,这个公式根本不对。


我找了下 numpy 的官方文档,是这么介绍的,


If both a and b are 1-D arrays, it is inner product of vectors (without complex conjugation).

If both a and b are 2-D arrays, it is matrix multiplication, but using matmul or a @ b is preferred.

If either a or b is 0-D (scalar), it is equivalent to multiply and using numpy.multiply(a, b) or a * b is preferred.

If a is an N-D array and b is a 1-D array, it is a sum product over the last axis of a and b.

If a is an N-D array and b is an M-D array (where M>=2), it is a sum product over the last axis of a and the second-to-last axis of b。


代码测试前 4 条(第 5 条就不测了),


import numpy as np
print(np.dot(np.array([1, 2]), np.array([3, 4])))
print(np.dot(np.array([[1, 2, 3],[4, 5, 6]]), np.array([[7, 8], [9, 10], [11, 12]])))
print(np.dot(np.array(3), np.array(4)))
print(np.dot(np.array([[1, 2],[3, 4]]), np.array([5, 6])))


测试结果,


11
[[ 58  64]
 [139 154]]
12
[17 39]


1.可以看到两个一维数组点乘的结果是一个标量,11 = 1 x 3 + 2 x4。

2.可以看到两个二维数组点乘的结果是 [[58,  64], [139, 154]] = [[1 x 7 + 2 x 9 + 3 x 11, 1 x 8 + 2 x 10 + 3 x 12],[4 x 7 + 5 x 9 + 6 x 11, 4 x 8 + 5 x 10 + 6 x 12]],即 m x s 的数组点乘 s x n 的数组,结果是 m x n 的数组,千万别想我最开始那么犯错。

3.可以看到两个标量点乘的结果是一个标量,12 = 3 x 4。

4.可以看到二维数组点乘一维数组的结果是 [17, 39] = [1 x5 + 2 x 6, 3 x 5 + 4 x 6]。

以上可以看出来,第 4 条和第 2 条很像,其实第 4 条就是 result = A(2-Dimension) x B(1-Dimension)的转置。第 1 条和第 2 条也很像,其实就是 result = A(1-Dimension) x B(1-Dimension)的转置,再把结果里的元素相加了。


终于结束了,可以亮出来大学的《线性代数》了,也蛮不容易的,大学时候线代挂科还补考了。


1.webp.jpg

《线性代数》同济第五版


0.webp.jpg

矩阵运算

目录
相关文章
|
6月前
|
BI C语言 索引
Python科学计算库Numpy数值运算基础详解(超详细 附源码)
Python科学计算库Numpy数值运算基础详解(超详细 附源码)
211 0
|
机器学习/深度学习 PyTorch TensorFlow
[深度学习入门]Numpy基础(上)
[深度学习入门]Numpy基础(上)
|
3月前
|
机器学习/深度学习 数据采集 并行计算
《零基础实践深度学习》1.7 附录:NumPy介绍 ndarray
这篇文章详细介绍了NumPy库的基本功能和应用,包括ndarray数组的使用、创建、属性查看、数据类型和形状的改变、基本运算、索引和切片,以及统计方法和随机数生成,是进行科学计算和数据分析的基础。
|
3月前
|
机器学习/深度学习 Serverless 数据处理
《零基础实践深度学习》 Numpy 线性代数 应用举例 张量表示
这篇文章介绍了NumPy在线性代数中的应用,包括矩阵操作和文件读写功能,并提供了使用NumPy进行图片处理和激活函数计算的示例,同时探讨了飞桨框架中张量(Tensor)的使用和与NumPy数组的转换。
|
5月前
|
Python
NumPy 舍入小数、对数、求和和乘积运算详解
NumPy 提供五种舍入小数的方法:`trunc()`, `fix()`, `around()`, `floor()`, `ceil()`。此外,它还支持对数运算,如 `log2()`, `log10()`, `log()`,以及自定义底数的对数。NumPy 的 `sum()` 和 `prod()` 函数用于数组求和与乘积,可指定轴进行计算,`cumsum()` 和 `cumprod()` 实现累积求和与乘积。关注公众号 "Let us Coding" 获取更多内容。
58 2
|
5月前
|
存储 Python
NumPy 简单算术:加减乘除及其他运算
NumPy 中的简单算术运算可以通过 `add`, `subtract`, `multiply`, `divide`, `power`, `mod`, `remainder` 等函数实现,这些函数支持条件运算,并接受 `where` 参数。例如,`add()` 实现加法,`subtract()` 表示减法,`multiply()` 是乘法,`divide()` 用于除法,`power()` 提升到幂次,`mod()` 和 `remainder()` 计算余数。`absolute()` 或 `abs()` 可以计算数组元素的绝对值。这些函数可用于数组或类似数组对象,返回新数组存储运算结果。
48 2
|
6月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
Python深度学习基于Tensorflow(1)Numpy基础
Python深度学习基于Tensorflow(1)Numpy基础
53 5
|
5月前
|
存储 数据处理 C语言
NumPy 通用函数(ufunc):高性能数组运算的利器
NumPy的通用函数(ufunc)提供高性能的逐元素运算,支持向量化操作和广播机制,能应用于数组的数学、逻辑和比较运算。ufunc可提高计算速度,避免低效的循环,并允许自定义函数以满足特定需求。例如,ufunc实现加法比循环更高效。通过`frompyfunc`可创建自定义ufunc。判断函数是否为ufunc,可检查其类型是否为`numpy.ufunc`。ufunc练习包括数组的平方、平方根、元素积及性能对比。
69 0
|
6月前
|
存储 数据处理 Python
NumPy数组运算:元素级与广播机制剖析
【4月更文挑战第17天】NumPy是Python数值计算库,提供元素级运算和广播机制。元素级运算针对数组每个元素单独计算,如加法、减法等;广播机制允许不同形状数组间运算,通过扩展小数组形状匹配大数组。了解这两点能帮助更好地运用NumPy进行数值计算和数据处理。
|
6月前
|
机器学习/深度学习 数据挖掘 Python
线性代数运算在NumPy中的实现
【4月更文挑战第17天】本文介绍了NumPy在Python中实现线性代数运算的方法,包括使用`ndarray`创建向量和矩阵,矩阵的转置,矩阵乘法,计算特征值和特征向量,解线性方程组,以及计算行列式和逆矩阵。通过NumPy,科学家和数据分析师能更高效地进行科学计算和数据分析。