问题标签 [numpy-einsum]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
695 浏览

python - 简化双 einsum

我试图用来numpy.einsum简化我的代码中的循环。

目前,我的代码如下所示:

我正在尝试numpy.einsum用作此循环的替代方案:

是否可以使用一个numpy.einsum而不是两个?

0 投票
1 回答
739 浏览

python - 用于两个 3dim 矩阵的 numpy einsum 的 Theano 版本

我有两个 3dim numpy 矩阵,我想根据一个轴做一个点积,而不在 theano 中使用循环。带有示例数据的 numpy 解决方案如下:

其中“a”的形状为 (7, 4, 15),“b”的形状为 (7, 4, 5)。“c”,定义为“a”和“b”的点积:

我正在寻找此示例的 theano 实现来计算“c”。

有任何想法吗?

0 投票
1 回答
338 浏览

python - 在numpy中乘以包含图像的张量

我有以下三阶张量。两个张量矩阵第一个张量包含 100 个 10x9 矩阵,第二个包含 100 个 3x10 矩阵(我刚刚在这个例子中填充了这些矩阵)。

我的目标是将矩阵乘以一对一的对应关系,这将产生一个具有形状的张量: (100, 3, 9)这可以通过一个 for 循环来完成,该循环只压缩两个张量,然后取每个张量的点,但我正在寻找只需使用 numpy 运算符即可。到目前为止,这里有一些失败的尝试

尝试1:

尝试 1 的输出:

(100, 3, 100, 9)

这意味着它尝试了所有可能的组合......这不是我所追求的。

实际上没有其他尝试甚至编译。我尝试使用 np.tensordot , np.einsum (在这里阅读https://jameshensman.wordpress.com/2010/06/14/multiple-matrix-multiplication-in-numpy它应该可以完成这项工作,但我没有得到正确的爱因斯坦指数)同样在同一个链接中,还有一些我无法想象的疯狂张量立方体重塑方法。关于如何解决这个问题的任何建议/想法解释?

0 投票
1 回答
60 浏览

python - 在没有显式复制的情况下使用 einsum

我有一个形状为 (n, n) 的矩阵 A 和另一个形状为 (p, n) 的矩阵 b。我需要得到一个矩阵 C 使得

我目前正在通过执行 np.matlib.repmat(A) 然后使用 np.einsum 来做到这一点,如下所示

但我可以看到创建 A1 是一种资源浪费,因为它只是一遍又一遍地使用相同的值。无论如何我可以在不创建中间矩阵 A1 的情况下做到这一点吗?

0 投票
1 回答
1801 浏览

python - 与 fortran 或 C 相比,numpy.einsum 高效吗?

我写了一个非常耗时的 numpy 程序。剖析之后,我发现大部分时间都花在了numpy.einsum.

虽然 numpy 是 LAPACK 或 BLAS 的包装器,但我不知道numpy.einsum它的性能是否与 LAPACK 或 BLAS 中的对应物相媲美。

那么,如果我切换到 fortran 或 C,我会得到很大的性能提升吗?

0 投票
2 回答
4093 浏览

python - 在 einsum 中对多个向量的外积求和

我已经通读了einsum手册和ajcr的基本介绍

我在非编码环境中对爱因斯坦求和的经验为零,尽管我试图通过一些互联网研究来解决这个问题(会提供链接,但还没有超过两个的声誉)。我还尝试使用 einsum 在 python 中进行实验,看看是否可以更好地处理事情。

然而,我仍然不清楚这样做是否既可行又有效:

在长度 (3) 和高度 (n) 相等的数组 (a 和 b) 的两个数组上,逐行产生 (row i: a on b) 的外积加上 (row i: b on a ),然后将所有外部乘积矩阵相加以输出一个最终矩阵。

我知道 'i,j->ij' 会产生一个向量对另一个向量的外积——这是让我失去兴趣的下一步。('ijk,jik->ij' 绝对不是)

我的另一个可用选项是遍历数组并从我用 cython 编写的函数调用基本函数(双外积和矩阵加法)(使用内置的 numpy 外部和 sum 函数不是一个选项,它太慢了)。我很可能最终也会将循环本身移动到 cython。

所以:

  1. 我怎样才能概括地表达我上面描述的过程?

  2. 它会比在 cython 中做所有事情提供真正的收益吗?还是有其他我不知道的选择?(包括我使用 numpy 的效率低于我可能的可能性......)

谢谢。


编辑示例:

(但是请注意,实际上我们正在处理长度更大的数组(即每个内部成员的长度仍然为 3,但最多有几千个这样的成员),并且这部分代码(不可避免地)被调用了很多次)

如果它有帮助,这里是两个外部产品相加的cython:

现在,我从“i in range(len(array))”循环中调用,如上所示。

0 投票
1 回答
660 浏览

numpy - 使用 np.einsum 和 np.tensordot 执行 4 阶张量的坐标变换

方程是

我能够使用

做这份工作,也期待

工作,但事实并非如此。

规格:

C 是一个四阶弹性张量:

Q 是一个改变 x 和 y 坐标的旋转矩阵。

Q_inv 是

np.einsum导致

我认为这是正确的,而四个np.tensordot导致

注意负的大数字。

0 投票
1 回答
1703 浏览

python - 仅使用 NumPy einsum 处理上三角元素

我正在使用 numpy einsum 来计算形状为 (3,N) 的列向量 pts 数组与其自身的点积,从而得到一个形状为 (N,N) 的矩阵点积与所有点积。这是我使用的代码:

这可行,但我只需要主对角线以上的值。IE。结果的上三角部分没有对角线。是否可以使用 einsum 仅计算这些值?或者以比使用 einsum 计算整个矩阵更快的任何其他方式?

我的 pts 数组可能非常大,所以如果我只能计算我需要的值,那么我的计算速度就会加倍。

0 投票
2 回答
1455 浏览

python - 是否可以使用 einsum 转置所有内容?

好的,我知道如何转置矩阵,例如:

对于一维数组,不可能使用这个“.T”工具(老实说,我不知道为什么)所以要转置一个向量,你必须改变范式并使用,例如:

并且因为B.T会给出相同的结果,所以我们应用这种范式变化,使用:

而且我发现这种范式变化有点反感,因为一维向量与二维向量(矩阵)绝不是不同的实体,从数学上讲它们来自同一个家庭并共享许多事物。

我的问题是:是否有可能用 numpy 皇冠上的宝石(有时称为)einsum 进行这种换位,以更紧凑和统一的方式用于每种张量?我知道你做的矩阵

你会得到,就像以前一样A.T

是否可以使用一维数组来做到这一点?

先感谢您。

0 投票
1 回答
1575 浏览

python - Numpy einsum 广播

有人可以解释一下广播(省略号)如何在 numpy.einsum() 函数中工作吗?

一些示例来说明如何以及何时可以使用它将不胜感激。

我检查了以下官方文档页面,但只有 2 个示例,我似乎无法理解如何解释和使用它。

http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.einsum.html