问题标签 [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 回答
144 浏览

numpy - Numpy - 为 3-d 网格上的所有网格点查找到测试点的 3-d 距离

我尝试了 np.hypot() 和 np.linalg.norm() 但它们都有一些问题(至少我是如何使用 thm 的)。

我很确定 np.hypot 只能计算 2-d distance。如果我有一个测试点 P (1,1,1) 和一个网格点 G (3,3,3),那么网格点 G 的返回值将类似于:((3-1)^2+( 3-1)^2)^(0.5) = 2.82

我可以直接调用 np.hypot,而不必循环通过网格点(我猜循环很慢,因此很糟糕),并且我在 3-d 的所有网格点处返回了这些到测试点的距离值meshgrid,但不计算 z 依赖关系(即 (1,2,0) 处的 d = (1,2,3) 处的 d:

使用 np.linalg.norm,我不知道如何在网格上的所有点上按元素计算返回值,传入的参数似乎是点 A(网格点)和点 B(测试点),但后来我除了循环之外,想不出任何方法来计算所有网格点,如下所示:

有谁知道我如何为 3d 网格上的所有网格点找到到测试点的真实 3d 距离?

0 投票
2 回答
1082 浏览

python-3.x - 计算两个数组列的成对和的总和

我正在寻找一种方法来避免以下代码段中的嵌套循环,其中AB是二维数组,每个形状都(m, n)带有mnbeeing 任意正整数:

上面的逻辑大致等价于

除了einsum计算产品的总和。

有没有一种方法,相当于einsum计算总和的总和?还是我必须为此操作编写扩展程序?

0 投票
2 回答
435 浏览

python - np.einsum 4 矩阵乘法的性能

给定以下 3 个矩阵:

einsum用来计算:

但我发现它的性能要差得多:

我不明白为什么。
总的来说,我正在尽可能地优化这段代码。我已经阅读了有关该np.tensordot功能的信息,但我似乎无法弄清楚如何将它用于给定的计算。

0 投票
1 回答
165 浏览

matlab - 优化张量乘法

我有一个我正在尝试优化的实时图像处理程序,这一切都归结为矩阵乘法。考虑我在初始化阶段计算的 3 个张量:

  1. A = np.arange(35 * 51 * 59).reshape([35, 51, 59])
  2. B = np.arange(37 * 51 * 51 * 59).reshape([37, 51, 51, 59])
  3. C = np.arange(59 * 27).reshape([59, 27])

每一帧,我都会以第四张量的形式获得一个新数据:

  • M = np.arange(35 * 37 * 59).reshape([35, 37, 59]).

目前,我正在计算D = np.einsum('xyf,xtf,ytpf,fr->tpr', M, A, B, C)D我想要的结果在哪里,这是程序的主要瓶颈。为了优化它,我试图遵循两个方向。

首先我尝试提出一个张量T,我可以预先计算一个函数A, B, C, D,然后它会全部沸腾为D = np.tensordot(M, T, axes=..). 我没有成功。我花了很多时间,这甚至可能吗?

此外,程序本身是用 MATLAB 编写的。由于它没有内置的张量乘法函数(einsumtensordot等效函数),我目前正在使用该tprod工具箱,并且正在执行以下操作:

由于 MATLAB 中的默认点积函数(用于 2D 矩阵)要快得多etprod,因此我想A, B, C, D以一种能够使用默认函数处理多个 2D 矩阵的方式将其重塑为 2D 数组,而无需手动编写for循环。我也没有成功。

有什么想法吗?谢谢!

0 投票
2 回答
294 浏览

python - Numpy einsum 二维数组的外部总和

我试图寻找答案,但找不到我需要的东西。抱歉,如果这是一个重复的问题。

假设我有一个 shape 的二维数组(n, n*m)。我想要做的是这个数组的外部总和到它的转置,从而产生一个形状为的数组(n*m, n*m)。例如,假设我有

我想做一个外部总和,A这样A.T输出是:

请注意,这np.add.outer不起作用,因为它将输入分解为向量。我可以通过做类似的事情

但这在相当大(和n)时似乎不合理。是否可以使用 来写这个总和?我只是似乎无法弄清楚。mn > 100m > 1000einsumeinsum

0 投票
1 回答
99 浏览

python - Python:数组的numpy数组的外积的所有排列的总和

我有一个数组 Ai 的 numpy 数组,我希望每个外部乘积 (np.outer(Ai[i],Ai[j])) 与缩放乘数相加以产生 H。我可以逐步完成并制作它们然后 tensordot它们带有比例因子矩阵。我认为事情可以大大简化,但还没有找到一种通用/有效的方法来为 ND 做到这一点。如何更容易地生成 Arr2D 和 H?注意:Arr2D 可以是 64 个二维数组,而不是 8x8 二维数组。

0 投票
1 回答
423 浏览

python - 用于高维度的 Einsum

考虑以下 3 个数组:

我想将矩阵 X 的每一列添加和求和到 W 的行,由 y 作为索引给出。因此,例如,如果 y 中的第一个元素是 3 ,我会将 X 的第一列添加到 W 的第四行(python 中的索引 3)并求和。我会一遍又一遍地做,直到 X 的所有列都添加到 W 的特定行并求和。我可以用不同的方式做到这一点:1-使用for循环:

2-使用 add.at 功能

3-但我不明白如何使用 einsum 来做到这一点。我得到了一个解决方案,但真的无法理解。

任何人都可以解释我这个结构吗?1 - (np.arange(N)[:,None,None] == y.ravel(),X)。我想这部分是指根据 y 将 X 的列与 W 的特定行相加。但是 W 在哪里?在这种情况下,为什么我们必须将 W 转换为 4 维?2- 'ijk,lk->il' - 我也不明白这一点。

i - 指行,j - 列,k- 每个元素,l - 'l' 也指什么?如果有人能理解这一点并向我解释,我将不胜感激。提前致谢。

0 投票
1 回答
192 浏览

python - einsums的numpy组成?

假设我有一个np.einsum执行一些计算的设备,然后将其直接泵入另一个np.einsum执行其他操作。一般来说,我可以将这两个einsums 组合成一个 seinsum吗?

我的具体用例是我正在做一个转置,一个矩阵乘法,然后是另一个矩阵乘法来计算b a^T a

0 投票
1 回答
168 浏览

python - Numpy einsum_path 报告更多 FLOP 和“减速”

对于这个话题np.einsum,我已经阅读了一堆讨论:

为了更多地了解为什么np.eimsum比通常np.sum的 ,np.product等更快(即使对于 anaconda 中的最新 numpy 版本),我正在使用np.einsum_path来查看优化过程优化了什么。

这样做的时候,我发现了一个有趣的现象。考虑这个最小的例子:

输出都是相同的:

优化的 FLOP在哪里增加(这意味着更多的计算?)并且理论加速比小于 1(这意味着更慢)。但是,如果我们实际计算计算时间:

如果我们查看对应于“本机”时序除以优化时序的第二列,它们都接近 1,这意味着优化并没有使其变慢:

我想知道伤口会np.einsum_path说它需要更多的 FLOP 并且它更慢?我相信时间是直接从 FLOP 的数量计算出来的,所以这两个基准基本上指的是同一件事。

顺便说一句,我附上了一个示例,显示np.einsum_path“通常”如何表现以说服上面的结果是异常的:

输出:

0 投票
1 回答
70 浏览

python - 优化数学计算

我有一个购买一对物品的四种可能性的模型(同时购买,不购买或只购买一个),并且需要优化(伪)对数似然函数。当然,其中一部分是伪对数似然函数的计算/定义。

以下是我的代码,其中 Beta 是每个客户的二维向量(有 U 个客户和 U 个不同的 beta 向量),X 是每个项目的二维向量(N 个项目中的每一个都不同)和 Gamma是一个对称矩阵,每对项目都有一个标量值 gamma(i,j)。df 是购买的数据框 - 每个客户一行,项目 N 列。

在我看来,所有这些循环都效率低下并且占用了太多时间,但我不确定如何加快计算速度,如果能帮助改进它,我将不胜感激。先感谢您!

添加/澄清 - 我正在使用此计算来优化和查找生成此伪似然函数数据的 beta 和 gamma 参数。
我正在使用 scipy optimize.minimize 和 'Powell' 方法。