问题标签 [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 - 矩阵乘法:将矩阵的每一行乘以 Python 中的另一个 2D 矩阵
我正在尝试从此矩阵乘法中删除循环(并了解有关优化代码的更多信息),并且我认为我需要某种形式的np.broadcasting
or np.einsum
,但是在阅读了它们之后,我仍然不确定如何将它们用于我的问题。
我知道我不能自己做np.multidot
,因为这会产生一个 (5,5) 数组。
我还发现了这一点:将矩阵乘以 Numpy 中另一个矩阵的每一行,但我不知道它是否与我的问题相同。
algorithm - 使用重复矩阵但不同下标优化 Einstein 求和
免责声明:我确实发布了数学堆栈交换或某种形式的帖子。但我从我的数学专业朋友那里听说,他们并没有真正使用爱因斯坦求和,但我知道机器学习使用了很多。因此我在这里发布了这个问题(作为优化算法性能)。
在研究矩阵计算时(例如,至少需要多少元素乘法),我试图计算以下梯度:
其中意味着在它们的ABC
第一个轴上收缩三个矩阵(例如2x3
,2x4
, 和与-轴相加)。基本上,它计算 3-matrix-contraction关于的范数梯度。然后再次计算该梯度的范数。2x5
3x4x5
2
ABC
A
A
这相当于:
或简化一点(由 证明autograd
):
我们可以用爱因斯坦求和形式写出来(被einsum
很多包的函数使用,比如numpy
,tensorflow
等等)
在写这篇文章时,我发现了矩阵B
,并且C
在求和中一次又一次地重复。我想知道我可以将那些“大量的 B 和 C”简化为某种矩阵功率吗?这应该使事情对数更快。我尝试手动简化但没有弄清楚。
非常感谢!如果我说的不正确,请纠正我。
python - 张量操作python中的内存和时间
目标 我的目标是计算您可以在下面看到的公式给出的张量。指数 i、j、k、l 从 0 到 40,p、m、x 从 0 到 80。
Tensordot 方法这个总和只是收缩了巨大张量的 6 个指数。我试图通过允许这种计算的张量点来做到这一点,但是我的问题是内存,即使我先做一个张量点,然后再做另一个。(我在 colab 工作,所以我有 12GB RAM 可用)
嵌套循环方法但是有一些额外的对称性控制 B 矩阵,即 B{ijpx} 的唯一非零元素使得 i+j= p+x。因此,我能够将 p 和 m 写为 x (p=i+jx, m=k+lx) 的函数,然后我做了 5 个循环,即为 i,j,k,l,x 但另一方面时间是问题,因为计算需要 136 秒,我想重复很多次。
嵌套循环方法中的时序目标将时间减少 10 倍是令人满意的,但如果可以将其减少 100 倍,那就绰绰有余了。
您对解决内存问题或减少时间有什么想法吗?您如何处理带有附加约束的此类求和?
(备注:矩阵 A 是对称的,到目前为止我还没有使用过这个事实。没有更多的对称性。)
这是嵌套循环的代码:
张量点方法的代码:
python - 如何使用 numpy einsum_path 结果?
我正在使用 numpy einsum 对一些 3 维和 4 维张量执行相当复杂的操作。
我的实际代码是
这就是我想要它做的事情。
使用 einsum_path,结果是:
这表明理论上的加速约为 200 倍。
如何使用此结果来加速我的代码?我如何“实施” einsum_path 告诉我的内容?
python-3.x - 通过堆叠其对角 K 矩阵来创建一个新的大矩阵
l 有 K(让 K 在这里是 7)不同维度的矩阵(50,50)
。我想通过用 K 矩阵填充对角线来创建一个新矩阵 L。因此 L 的尺寸为 (50*K,50*K)。
我试过什么?
它确实通过在其对角线内堆叠 K1 七次来创建一个新矩阵 L。但是,我想分别堆叠 K1,K2,K3,K5,K6,K7 而不是 K1 七次。
输入:
预期产出:
numpy - Einsum 计算 c 距离的速度非常慢
我正在通过 np.einsum 计算马氏距离:
其中,协方差矩阵的逆矩阵 VI 是 ,783 x 783
而 delta 是6000 x 783
。这条线在我的 2016 Macbook Pro 上执行需要 10 秒。我怎样才能让它更快?
我必须将这条线计算 200k 到 300k 次。矢量化可能不是一个选项,因为每个类的 VI 都不同。
python - 用 numpy (einsum) 向量化多维矩阵乘积
我想以矢量化方式(1000xmxm dot 1000xnxm --> 1000xnxm)在一系列 nxm 矩阵上使用 mxm 数组执行一系列旋转。 如果我的 nxm 矩阵是 1xm 向量,这个问题似乎有答案,但不幸的是它们不是。我想知道是否有一个我可以使用的 einsum,或者其他一些矩阵操作不必循环超过 1000 次。
numpy - 将批处理矩阵(3d 数组,每个矩阵是一个图像)重塑为 2d(图像网格)
假设我们有一个 3d 数组A.shape = (100, 5, 5)
,每个小矩阵(5,5)
都是一个图像,现在我想将这个 3d 数组重塑为图像的方形网格B.shape=(50,50)
,使图像布局为 10*10 网格。
我可以使用np.stack
某种工具来做到这一点,但我想知道是否可以使用np.einsum
?
python - Numpy 中用于矩阵乘法的 matmul() 的旧版本是什么?
我需要使用没有 matmul() 的旧版本的 NumPy。在 NumPy 中乘以矩阵的原始方法是什么?我知道 * 是元素乘法,并且 .dot() 在某些情况下是不同的。我只想要标准的线性代数乘法。
谢谢。
numpy - 使用numpy einsum进行高维减法广播
我在使用广播减法时遇到了麻烦。我的问题如下。x
我有一个shape数组[L,N]
,其中 L 是一个整数,N 是我的问题的变量数。我需要计算一个[L,N,N]
数组,其中每个元素l,i,j
包含它x[l,i]-x[l,j]
。如果 L=1 这相当于在减法上运行广播:x-x.T
例如这里 L=1 和 N=3:
但是,如果增加维数 L,事情就会变得更加复杂并进入np.einsum
函数领域。所以我尝试重新创建我的示例,在 L=2 的情况下,我复制了两行。我期望得到一个 2x3x3 数组,其中包含两个元素相等的 3x3 矩阵。
返回
但是如何用 numpy einsum 做到这一点?我只能获得产品:
有没有增加维度的 numpy 批量减法或加法的具体示例?