问题标签 [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.
python - einsum 椭圆的终极灵活性
我有一个关于 einsum ellipsis 的问题,我认为肯定会在 StackExchange 上的某个地方,但不知何故我似乎找不到。
本质上,我有一些代码可以使用 numpy's 进行大量矩阵和向量收缩einsum
。输入通常是一些参数,然后用于创建向量和矩阵。该代码运行良好,但现在我想对其进行概括,以便可以在一定范围内扫描输入参数。最好的办法是使它们成为向量并修改我的einsum
表达式,以便它们接受任意数量的附加维度,这些维度只是简单地通过。这个问题是问这是否可能,如果可能,如何。
所以在我看来,这个问题归结为以下几点。假设我有一个einsum
创建某种矩阵乘法的表达式,例如
现在我想为 a 和 b 添加任意数量的索引,并简单地将它们添加为最终矩阵中的额外索引,例如
现在,当您只对 a 或 b 之一执行此操作时,您可以通过省略号轻松执行此操作
所以我的问题是你是否可以以einsum
某种方式有多个椭圆,例如
这当然会引发错误,但希望从示例中可以清楚地了解我的意思。
是否einsum
支持这种“多省略号”表示法?或者有没有其他方法可以在不循环的情况下实现这一点?
我的猜测是没有这样的方法,因为人们必须知道einsum
以什么顺序放置剩余的索引,即必须以某种方式标记椭圆。
python-3.x - 确定两点是否彼此最接近的最快方法
我的问题包括以下内容:给我两对角度(在球坐标中),它由两部分组成——方位角和纬度角。如果我们无限延伸两个角度(从而增加它们各自的半径)以形成一条指向这对角度给定方向的长线,那么我的目标是确定
- 如果它们相交或彼此非常接近,并且
- 它们究竟在哪里相交。
目前,我尝试了几种方法:
最明显的是迭代比较每个半径,直到两者之间存在匹配或足够小的距离。(当我说比较每个半径时,我指的是将每个球坐标转换为笛卡尔坐标,然后找到两者之间的欧几里得距离)。但是,这个运行时是 $O(n^{2})$,如果我试图扩展这个程序,它会非常慢
第二个最明显的方法是使用优化包来找到这个距离。不幸的是,我不能迭代优化包,并且在一个实例之后优化算法重复相同的答案,这没有用。
最不明显的方法是从角度直接计算(使用微积分)精确的半径。虽然这是一种快速的方法,但它并不是非常准确。
注意:虽然交叉点始终位于零原点 (0,0,0) 似乎很简单,但情况并非总是如此。有些点永远不会相交。
方法代码 (1)
方法代码 (3)
我的问题有两个:
有没有更快、更准确的方法来找到两个点的半径?
如果是这样,我该怎么做?
编辑:我正在考虑创建两个半径的两个 numpy 数组,然后通过 numpy 布尔逻辑比较它们。但是,我仍然会迭代地比较它们。有没有更快的方法来进行这种比较?
python - 如何通过使用 numpy einsum 和 numexpr 计算核函数来提高性能?
我正在尝试为库中的svm.SVR
方法定义一些著名的内核,例如 RBF、双曲正切、傅里叶等sklearn
。我开始工作rbf
(我知道 svm 中有一个用于 rbf 的默认内核,但我需要定义一个以便以后能够自定义它),并在这里找到了一些有用的链接并选择了这个:
我使用这个是因为我可以将它用于我的火车(形状为 [3850,4])和具有不同形状的测试数据(形状为 [1200,4])。但问题是它太慢了,我必须等待很长时间才能得到结果。我什至在 cython 中使用了静态类型和内存视图,但它的性能不如默认的svm
rbf 内核。我还发现了这个链接,它是关于同样的问题,但是使用它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)
在第二个代码中替换第一个代码即可加快速度。任何帮助将不胜感激。
python - 了解 PyTorch einsum
我熟悉einsum
NumPy 的工作原理。PyTorch 也提供了类似的功能:torch.einsum()。在功能或性能方面有哪些相同点和不同点?PyTorch 文档中可用的信息相当少,并且没有提供任何关于此的见解。
matlab - 多维数组的元素矩阵乘法
我想在 MATLAB 中实现逐分量矩阵乘法,这可以numpy.einsum
在 Python 中使用,如下所示:
到目前为止,我使用 for-loop of i
、j
和n
,但我不想,至少 for-loop of n
。
python - numpy.einsum 错误:操作数的下标过多
我正在尝试使用einsum
执行张量乘法。我在 MATLAB 中工作,但正在使用 python 接口进行调用numpy.einsum
,如本问答中所述。下面是我用来执行乘法的代码:
但是,上面的代码失败并出现以下错误:
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()
吗?
python - 使用 np.einsum 时忽略维度
我np.einsum
用来计算图表中的材料流量(本例中为 1 个节点到 4 个节点)。流量由amount
(amount.shape == (1, 1, 2)
维度定义某些标准,我们称它们为a
, b
, c
)给出。
布尔矩阵根据( ; )的, ,标准route
确定允许的流量。我标注尺寸, , , 。等价于s 尺寸,是流动的方向(0、1、2 或 3)。为了确定 中的材料量,我计算并获得了一个 y-dim 向量,其中流入。路线还有一个隐含的优先级。例如, any用于any , any用于下一个更高的 y-dim 路线,依此类推。(last y-index) 定义了包罗万象的路线,也就是说,它的值是a
b
c
y
route.shape == (4, 1, 1, 2)
yabc
y
a
b
c
abc
amount
abc
y
y
np.einsum('abc,yabc->y', amount, route)
y
route[0, ...] == True
False
y=1..3
route[1, ...] == True
False
route[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=2
y=3
5000.0
y=1
解决方案尝试
下面的作品,但不是很麻木。如果可以消除循环,那就太好了。
换句话说,对于 中的每个值amount2
,我正在寻找最低的索引yx
,temp
以便可以将值写入result[y] = value
(x 被忽略)。
另一种降低维度的尝试route
是:
这基本上保留了由 的第一维赋予的上述优先级route
。当较高优先级数组在该子索引处已经具有 True 值时,任何较低优先级(较高索引)数组都不能包含 True 值。虽然这比我的显式方法要好得多,但如果for x in xrange...
循环可以表示为 numpy 向量操作,那就太好了。
python - numpy.einsum的优化方案
numpy.einsum 的优化方案是什么?它是否优化了内存消耗或 CPU 或其他任何东西?
我没有看到任何地方讨论过这个问题。也许它与不同的“优化”选项有关,我不明白
numpy - numpy中布尔数组的爱因斯坦求和
numpy 中布尔数组的爱因斯坦求和(numpy.einsum)不会产生预期的结果。Numpy.einsum 函数对布尔数组进行逻辑运算,这在数值上下文中是有问题的。
对于布尔数组 x = [True, False, True],我希望 x 的总和为 2,结果不应取决于函数的特定选择。但是,numpy.sum 给出了 2,而 numpy.einsum 给出了 True。
我不确定我是否误解了某些东西或者我的代码有问题。任何帮助表示赞赏。