- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图理解 numpy.einsum() 函数,但文档以及 this answer来自 stackoverflow 的问题仍然给我留下了一些问题。
让我们取答案中定义的爱因斯坦和和矩阵。
A = np.array([0, 1, 2])
B = np.array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
np.einsum('i,ij->i', A, B)
因此,根据我对爱因斯坦求和的理解,我会将此函数翻译为等效于符号 (A_i*B_ij),因此我将获得:
j = 1 : A_1*B_11 + A_2*B_21 + A_3*B_31
j = 2 : A_1*B_12 + A_2*B_22+ A_3*B_32
依此类推,直到 j = 4。这给出了
j = 1 : 0 + 4 + 16
j = 2 : 0 + 5 + 18
根据我的理解,这将是爱因斯坦求和。相反,该函数不执行总和,而是将单独的项存储在矩阵中,我们可以在矩阵中找出 (A_i * B_ij) 的结果
0 0 0 0
4 5 6 7
16 18 20 22
这实际上是如何由函数控制的?我觉得这是由文档中提到的输出标签控制的:
The output can be controlled by specifying output subscript labels as well. This specifies the label order, and allows summing to be disallowed or forced when desired
所以我以某种方式假设放置 ->i
会禁用内部总和的求和。但这究竟是如何工作的呢?这对我来说不清楚。将 ->j
提供预期的实际爱因斯坦总和。
最佳答案
看来你对爱因斯坦求和的理解不正确。您写出的下标运算乘法正确,但求和在错误的轴上。
想想这意味着什么:np.einsum('i,ij->i', A, B)
.
A
有形状 (i,)
和 B
有形状 (i, j)
.B
的每一列相乘通过 A
.B
的第二个轴求和,即在标记为 j
的轴上.这给出形状为 (i,) == (3,)
的输出,而你的下标符号给出形状的输出 (j,) == (4,)
.您在错误的轴上求和。
更多细节:
请记住,乘法总是先发生。左边的下标告诉 np.einsum
输入数组的哪些行/列/等要相互相乘的函数。此步骤的输出始终与最高维输入数组具有相同的形状。也就是说,此时,假设的“中间”数组的形状为 (3, 4) == B.shape
.
乘法之后是求和。这是由从右侧省略哪些下标控制的。在这种情况下,j
被省略,这意味着沿着数组的第一个轴求和。 (您正在对第零求和。)
如果您改为写:np.einsum('i,ij->ij', A, B)
, 会有没有求和,因为没有省略下标。因此,您将获得问题末尾的数组。
举几个例子:
示例 1:
没有省略的下标,所以没有求和。只需乘以 B
的列通过 A
.这是您写出的最后一个数组。
>>> (np.einsum('i,ij->ij', A, B) == (A[:, None] * B)).all()
True
示例 2:
与示例相同。将列相乘,然后对输出的列求和。
>>> (np.einsum('i,ij->i', A, B) == (A[:, None] * B).sum(axis=-1)).all()
True
示例 3:
你在上面写的总和。将列相乘,然后对输出的行求和。
>>> (np.einsum('i,ij->j', A, B) == (A[:, None] * B).sum(axis=0)).all()
True
例 4:
请注意,我们可以在末尾省略所有 轴,以获取整个数组的总和。
>>> np.einsum('i,ij->', A, B)
98
例 5:
请注意,求和确实发生了,因为我们重复了输入标签 'i'
.如果我们改为对输入数组的每个轴使用不同的标签,我们可以计算类似于 Kronecker 产品的东西:
>>> np.einsum('i,jk', A, B).shape
(3, 3, 4)
编辑
爱因斯坦求和的 NumPy 实现与传统定义略有不同。从技术上讲,爱因斯坦和没有“输出标签”的概念。这些总是由重复的输入标签暗示。
来自文档:"Whenever a label is repeated, it is summed."
所以,传统上,我们会写类似 np.einsum('i,ij', A, B)
的东西.这相当于 np.einsum('i,ij->j', A, B)
. i
重复,所以求和,只留下标记为 j
的轴.您可以将我们指定无输出标签的总和视为与仅指定输入中不重复的标签相同。即标签'i,ij'
与'i,ij->j'
相同.
输出标签是在 NumPy 中实现的扩展或扩充,它允许调用者在轴上强制求和或强制不求和。来自文档:"The output can be controlled by specifying output subscript labels as well. This specifies the label order, and allows summing to be disallowed or forced when desired."
关于python - 有关 numpy.einsum() 的附加信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47366812/
我有 2 个数组,其中一个的大小为: A = np.random.uniform(size=(48, 1000000, 2)) 另一个是 B = np.random.uniform(size=(48)
似乎是 numpy 的 einsum功能不适用于 scipy.sparse矩阵。有没有其他方法可以做这些事情einsum可以处理稀疏矩阵吗? 回应@eickenberg 的回答:我想要的特定 eins
我有以下张量执行, np.einsum('k,pjqk,yzjqk,yzk,ipqt->it', A, B, C, D, E) 而且我注意到,当“z”或“q”在维度上扩展时,执行时间确实受到了影响,尽
考虑下面的 3 个数组: np.random.seed(0) X = np.random.randint(10, size=(4,5)) W = np.random.randint(10, size=
我有一个形状为 (n, n) 的矩阵 A 和另一个形状为 (p, n) 的矩阵 b。我需要得到一个矩阵 C 使得 C[i] = (A * b[i, np.newaxis, :]) * b[i, :,
随着最近对 Numpy (1.14) 的更新,我发现它破坏了我的整个代码库。这是基于将默认的 numpy einsum 优化参数从 False 更改为 True。 因此,以下基本操作现在失败了: a
我已经搜索了一种解决方案,使用 einsum 确定行数不相等但列数相等的 numpy 数组的距离。我尝试了各种组合,但唯一能成功的方法是使用以下代码。我显然遗漏了一些东西,文献和众多线程并没有让我更接
我很熟悉einsum在纽比的运作方式。pytorch也提供了类似的功能:torch.einsum()。在功能和性能方面有什么相同点和不同点?在Py火炬文档中提供的信息相当稀少,没有提供任何关于这方面的
我一直在尝试调试某个模型,该模型在重复几次的层中使用 torch.einsum 运算符。 在尝试分析训练期间模型的 GPU 内存使用情况时,我注意到某个 Einsum 操作显着增加了内存使用量。我正在
我正在尝试将三个数组 (A x B x A) 与维度 (19000, 3) x (19000, 3, 3) x (19000, 3) 相乘,这样最后我得到一个大小为 (19000) 的一维数组,所以我
我正在尝试潜入 einsum符号。此 question and answers帮了我很多。 但是现在我不能掌握einsum的机器计算外积时: x = np.array([1, 2, 3]) y = n
想象一下,我有整数,n,q和具有这些维度的向量/数组: import numpy as np n = 100 q = 102 A = np.random.normal(size=(n,n)) B =
我有两个包含兼容矩阵的 numpy 数组,想计算使用 numpy.einsum 的元素明智的外积.数组的形状是: A1 = (i,j,k) A2 = (i,k,j) 因此数组分别包含 i 个形状为 (
我想使用类似 np.dot 或(最好)np.einsum 的东西来有效地执行它们相同的功能,但使用备用 ufunc 而不是 np.multiply。例如,考虑这两个数组: >>> a array([[
我有两个包含兼容矩阵的 numpy 数组,想计算使用 numpy.einsum 的元素明智的外积.数组的形状是: A1 = (i,j,k) A2 = (i,k,j) 因此数组分别包含 i 个形状为 (
为什么这些输出不同?这是有意的行为吗?我使用的是 tensorflow 1.12 import tensorflow as tf matrix = tf.constant([[1, 2, 3],
我有以下 Einstein Sum (einsum) 表达式, import numpy as np x = np.random.rand(1,8,2,8,10) y = np.random.rand
是否有一种优雅的方法可以根据 einsum 的输入参数预先计算 np.einsum 结果的形状(无需运行计算)? # Given a, b and signature with # a.shape =
我已阅读 einsum manual和 ajcr 的 basic introduction 我在非编码环境中对爱因斯坦求和的经验为零,尽管我尝试通过一些互联网研究来弥补这一点(将提供链接,但还没有超过
我尝试寻找答案,但找不到我需要的东西。如果这是一个重复的问题,我们深表歉意。 假设我有一个形状为 (n, n*m) 的二维数组。我想要做的是这个数组与其转置的外部总和,从而产生形状为 (n*m, n*
我是一名优秀的程序员,十分优秀!