问题标签 [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 投票
1 回答
310 浏览

python - einsum 椭圆的终极灵活性

我有一个关于 einsum ellipsis 的问题,我认为肯定会在 StackExchange 上的某个地方,但不知何故我似乎找不到。

本质上,我有一些代码可以使用 numpy's 进行大量矩阵和向量收缩einsum。输入通常是一些参数,然后用于创建向量和矩阵。该代码运行良好,但现在我想对其进行概括,以便可以在一定范围内扫描输入参数。最好的办法是使它们成为向量并修改我的einsum表达式,以便它们接受任意数量的附加维度,这些维度只是简单地通过。这个问题是问这是否可能,如果可能,如何。


所以在我看来,这个问题归结为以下几点。假设我有一个einsum创建某种矩阵乘法的表达式,例如

现在我想为 a 和 b 添加任意数量的索引,并简单地将它们添加为最终矩阵中的额外索引,例如

现在,当您只对 a 或 b 之一执行此操作时,您可以通过省略号轻松执行此操作

所以我的问题是你是否可以以einsum某种方式有多个椭圆,例如

这当然会引发错误,但希望从示例中可以清楚地了解我的意思。

是否einsum支持这种“多省略号”表示法?或者有没有其他方法可以在不循环的情况下实现这一点?

我的猜测是没有这样的方法,因为人们必须知道einsum以什么顺序放置剩余的索引,即必须以某种方式标记椭圆。

0 投票
1 回答
823 浏览

python-3.x - 确定两点是否彼此最接近的最快方法

我的问题包括以下内容:给我两对角度(在球坐标中),它由两部分组成——方位角和纬度角。如果我们无限延伸两个角度(从而增加它们各自的半径)以形成一条指向这对角度给定方向的长线,那么我的目标是确定

  1. 如果它们相交或彼此非常接近,并且
  2. 它们究竟在哪里相交。

目前,我尝试了几种方法:

  1. 最明显的是迭代比较每个半径,直到两者之间存在匹配或足够小的距离。(当我说比较每个半径时,我指的是将每个球坐标转换为笛卡尔坐标,然后找到两者之间的欧几里得距离)。但是,这个运行时是 $O(n^{2})$,如果我试图扩展这个程序,它会非常慢

  2. 第二个最明显的方法是使用优化包来找到这个距离。不幸的是,我不能迭代优化包,并且在一个实例之后优化算法重复相同的答案,这没有用。

  3. 最不明显的方法是从角度直接计算(使用微积分)精确的半径。虽然这是一种快速的方法,但它并不是非常准确。

注意:虽然交叉点始终位于零原点 (0,0,0) 似乎很简单,但情况并非总是如此。有些点永远不会相交。

方法代码 (1)

方法代码 (3)

我的问题有两个:

  1. 有没有更快、更准确的方法来找到两个点的半径?

  2. 如果是这样,我该怎么做?

编辑:我正在考虑创建两个半径的两个 numpy 数组,然后通过 numpy 布尔逻辑比较它们。但是,我仍然会迭代地比较它们。有没有更快的方法来进行这种比较?

0 投票
2 回答
343 浏览

python - 如何通过使用 numpy einsum 和 numexpr 计算核函数来提高性能?

我正在尝试为库中的svm.SVR方法定义一些著名的内核,例如 RBF、双曲正切、傅里叶等sklearn。我开始工作rbf(我知道 svm 中有一个用于 rbf 的默认内核,但我需要定义一个以便以后能够自定义它),并在这里找到了一些有用的链接并选择了这个:

我使用这个是因为我可以将它用于我的火车(形状为 [3850,4])和具有不同形状的测试数据(形状为 [1200,4])。但问题是它太慢了,我必须等待很长时间才能得到结果。我什至在 cython 中使用了静态类型和内存视图,但它的性能不如默认的svmrbf 内核。我还发现了这个链接,它是关于同样的问题,但是使用它numpy.einsum并且numexpr.evaluate对我来说有点困惑。事实证明,就速度性能而言,这是最好的代码:

从 scipy.linalg.blas 导入 sgemm

此代码仅适用于一个输入 (X),我找不到针对我的情况修改它的方法(两个输入具有两种不同的大小 - 内核函数获取形状为 (m,n) 和 (l,n) 的矩阵并根据svm docs输出 (m,l )。我想我只需要K[i,j] = np.exp(-1*np.linalg.norm(x-y)**2)在第二个代码中替换第一个代码即可加快速度。任何帮助将不胜感激。

0 投票
1 回答
18176 浏览

python - 了解 PyTorch einsum

我熟悉einsumNumPy 的工作原理。PyTorch 也提供了类似的功能:torch.einsum()。在功能或性能方面有哪些相同点和不同点?PyTorch 文档中可用的信息相当少,并且没有提供任何关于此的见解。

0 投票
1 回答
571 浏览

matlab - 多维数组的元素矩阵乘法

我想在 MATLAB 中实现逐分量矩阵乘法,这可以numpy.einsum在 Python 中使用,如下所示:

到目前为止,我使用 for-loop of ijn,但我不想,至少 for-loop of n

0 投票
0 回答
3138 浏览

python - numpy.einsum 错误:操作数的下标过多

我正在尝试使用einsum执行张量乘法。我在 MATLAB 中工作,但正在使用 python 接口进行调用numpy.einsum,如本问答中所述。下面是我用来执行乘法的代码:

但是,上面的代码失败并出现以下错误:

0 投票
1 回答
218 浏览

python - 传递给 numpy.einsum() 的下标是什么意思?

我试图理解一个 python 代码,它用于numpy.einsum()将 4 维 numpy 数组 , 转换为 2 维A或 3 维数组。传递给的下标numpy.einsum()如下:

等等。按照(Understanding NumPy's einsum)和(Python - Sum 4D Array)的答案,例如,我试图用它numpy.sum()来理解上述下标的含义,Mat1 = np.sum(A, axis=(0,3))但我无法重现我得到的结果numpy.einsum()。有人可以解释一下这些下标是如何解释的numpy.einsum()吗?

0 投票
1 回答
270 浏览

python - 使用 np.einsum 时忽略维度

np.einsum用来计算图表中的材料流量(本例中为 1 个节点到 4 个节点)。流量由amountamount.shape == (1, 1, 2)维度定义某些标准,我们称它们为a, b, c)给出。

布尔矩阵根据( ; )的, ,标准route确定允许的流量。我标注尺寸, , , 。等价于s 尺寸,是流动的方向(0、1、2 或 3)。为了确定 中的材料量,我计算并获得了一个 y-dim 向量,其中流入。路线还有一个隐含的优先级。例如, any用于any , any用于下一个更高的 y-dim 路线,依此类推。(last y-index) 定义了包罗万象的路线,也就是说,它的值是abcyroute.shape == (4, 1, 1, 2)yabcyabcabcamountabcyynp.einsum('abc,yabc->y', amount, route)yroute[0, ...] == TrueFalsey=1..3route[1, ...] == TrueFalseroute[3, ...]True当之前的 y 索引值为 False ( (route[0] ^ route[1] ^ route[2] ^ route[3]).all() == True) 时。

这工作正常。x但是,当我引入另一个仅存在于 中route而不存在于 中的标准(维度)时amount,这种逻辑似乎被打破了。下面的代码演示了这个问题:

是否有任何可行的操作可以应用route.all(1)也不起作用)来忽略 x 维度?

另一个例子:

可以被解释为1000.0被路由到y=0(并且没有其他 y 目标)并且5000.0与 destination 和 兼容,y=1但理想情况下,我只想出现在(因为这是最低索引和最高目标优先级)。y=2y=35000.0y=1

解决方案尝试

下面的作品,但不是很麻木。如果可以消除循环,那就太好了。

换句话说,对于 中的每个值amount2,我正在寻找最低的索引yxtemp以便可以将值写入result[y] = value(x 被忽略)。

另一种降低维度的尝试route是:

这基本上保留了由 的第一维赋予的上述优先级route。当较高优先级数组在该子索引处已经具有 True 值时,任何较低优先级(较高索引)数组都不能包含 True 值。虽然这比我的显式方法要好得多,但如果for x in xrange...循环可以表示为 numpy 向量操作,那就太好了。

0 投票
0 回答
133 浏览

python - numpy.einsum的优化方案

numpy.einsum 的优化方案是什么?它是否优化了内存消耗或 CPU 或其他任何东西?

我没有看到任何地方讨论过这个问题。也许它与不同的“优化”选项有关,我不明白

0 投票
1 回答
146 浏览

numpy - numpy中布尔数组的爱因斯坦求和

numpy 中布尔数组的爱因斯坦求和(numpy.einsum)不会产生预期的结果。Numpy.einsum 函数对布尔数组进行逻辑运算,这在数值上下文中是有问题的。

对于布尔数组 x = [True, False, True],我希望 x 的总和为 2,结果不应取决于函数的特定选择。但是,numpy.sum 给出了 2,而 numpy.einsum 给出了 True。

我不确定我是否误解了某些东西或者我的代码有问题。任何帮助表示赞赏。