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

python - Einsum 优化基本操作失败

随着最近对 Numpy (1.14) 的更新,我发现它破坏了我的整个代码库。这是基于将默认的 numpy einsum 优化参数从 False 更改为 True。

结果,以下基本操作现在失败:

带有以下错误跟踪:

我向 einsum 请求的操作看起来很简单……那为什么会失败呢?如果我设置“optimize=False”,它工作得很好。

我尝试使用 einsum_path 进行探索,但生成的路径信息在优化和不优化的情况下是相同的。

0 投票
0 回答
55 浏览

python-3.x - python2和python3中的einsum之间有什么已知的区别吗?

Python2 和 Python3 中的 einsum 之间有什么已知的区别吗?

https://github.com/tscohen/GrouPy 我试图在这里运行 Tensorflow 的代码,结果不匹配

文件“/home/----/.conda/envs/py36/lib/python3.6/site-packages/numpy/core/einsumfunc.py”,第 710 行,einsum_path 中的“不匹配先前的术语。”,字符, tnum) ValueError: ("操作数 %d 的标签 '%s' 的大小与前面的术语不匹配。", 'h', 1)

在 Python 3.6 中,但不是当我在 Python 2.7 中运行相同的代码时

0 投票
1 回答
784 浏览

numpy - Numpy Einsum 路径差异和优化参数

我有以下张量执行,

而且我注意到,当“z”或“q”在维度上扩展时,执行时间确实会受到影响,尽管我的直觉是它可能不应该那么糟糕——也许这是我可以通过手动张量收缩来优化的输入形式。

经过一番挖掘,我看到优化有两种模式:“最佳”和“贪婪”。如果我分别针对两种模式评估我的路径:

如前所述,测试结果是“最佳”对我来说要快得多。

问题

谁能简单地解释一下区别是什么以及为什么将“贪婪”设置为默认值?

总是使用“最佳”的缺点是什么?

如果我的 einsum 计算要运行 1000 次(这是优化迭代的一部分),我是否应该重组执行以自动受益于“最佳”路径而无需重新计算(或“贪婪”路径)每次?

0 投票
1 回答
837 浏览

python - double np.einsum 的性能以及如何加速

考虑这个MWE

my_func() 是我第一次尝试进行计算,但我想加快速度。然后我尝试了以下修改后的功能:

但是,当我%timeit在这两个功能上运行时,我得到

为什么第二种方法比第一种慢?如何优化 my_func() 以使其更快?

0 投票
1 回答
960 浏览

python - `(N,M,M)` 矩阵的 Python `expm`

让我们A成为一个(N,M,M)矩阵(N非常大),我想scipy.linalg.expm(A[n,:,:])为每个n in range(N). 我当然可以只使用一个for循环,但我想知道是否有一些技巧可以以更好的方式做到这一点(比如np.einsum)。

对于其他操作,例如反转矩阵(反转在评论中解决),我有同样的问题。

0 投票
0 回答
214 浏览

python - numpy.einsum 有时会忽略 dtype 参数

假设我有两个 int8 类型的数组。我想在它们上使用 einsum,这样所有的计算都将作为 int64 完成,但我不想将整个数组转换为 int64。如果我理解正确,这就是 dtype 参数的用途。但它似乎并不总是有效。

它确实按预期工作的示例:

无法按预期工作的示例:

对于这些示例,我在带有 numpy 1.14.0 的 Windows 上使用了 python 3.6.4

当我尝试其他 dtypes 时也会发生同样的情况,例如 float64,即使我使用 cast='unsafe'。

为什么会发生这种情况,我怎样才能让它发挥作用?



更新
einsum 有 optimize=True 作为默认值,至少在 numpy 1.14.0 中。当使用 optimize=False 时,它​​会按预期工作(虽然对于大型数组来说要慢得多):


从 einsum.py 的简要介绍来看,似乎当 optimize=True 时,它​​会检查使用 numpy.tensordot 是否比 einsum 实现更好。如果是(它应该在我的第二个示例中,因为它只是一个常规矩阵乘法),那么它使用 tensordot,但它不会将 dtype 参数传递给它。事实上, tensordot 甚至没有 dtype 参数。


如果这是正确的,那么需要一个后续问题(这可能值得它自己的帖子?):
我如何矩阵乘以某个 dtype 的两个矩阵,比如 int8,这样所有的计算都将完成例如,int64 或 float64(因此不会溢出/丢失精度,除非 int64/float64 也会),但不必先将它们转换为所需的类型,此外,操作的实现本身不应转换矩阵总的来说,每次只有一小部分(因此操作所需的内存不会比保存这些矩阵和结果所需的内存大很多)?
这可以以与 numpy.dot 相当的效率完成吗?

0 投票
1 回答
107 浏览

python - 点积 B^tDB 不返回对称数组

我正在尝试制作表达式的点积,它应该是对称的。

事实证明,事实并非如此。

B是一个 4D 数组,我必须将其最后两个维度转置为B ^t。

D是一个二维数组。(它是有限元方法程序员已知的刚度矩阵的表达式)

与第二个选择相关的numpy.dot产品(这个想法来自这个主题:Numpy Matrix Multiplication U*B*UT Results in Non-symmetric Matrix)已经被使用并且问题仍然存在。numpy.transposenumpy.einsum

在计算结束时,获得了乘积B ^t DB,当通过减去它的转置B ^t DB来验证它是否真的是对称的时,仍然有一个残差。

点积或爱因斯坦求和仅用于感兴趣的维度(最后一个)。

问题是:如何消除这些残留物?

0 投票
0 回答
196 浏览

python - 使用 numexpr 评估爱因斯坦求和

我目前正在处理大型 numpy 数组乘法,使用numpy.einsum,并且一直面临MemoryError问题。这就是为什么我试图在可能的情况下使用numexpr. 据我所理解:

在技​​术上与

然而,在其他情况下,事情似乎并不那么简单。假设我有三个表达式:

使用 实现这三个的等效方法是numexpr什么?

0 投票
2 回答
255 浏览

python - 变量交互的计算(矩阵中向量的点积)

如果我将向量x(1,n) 与自身相乘,即np.dot(x.T, x)我将得到一个二次形式的矩阵。

如果我有一个矩阵Xmat(k, n),我如何有效地计算逐行点积并只选择上三角元素?

所以,自动取款机。我有以下解决方案:

然后compute_interaction(np.asarray([2,5]))屈服array([ 2, 5, 4, 10, 25])

当我有一个矩阵时,我使用

这产生了我想要的:

除了使用 来计算之外,还有其他方法apply_along_axis吗?也许使用np.einsum

0 投票
1 回答
133 浏览

python - 将这两个向量相乘的大多数 Pythonic 方法?

我有两个形状的ndarray:

我需要将 A 和 B 相乘以获得新的 ndarray:

另一种思考方式是,向量 B 的每一行沿 A 的轴 =-2 相乘,得到一个新的 1,32,512,640 立方体。B 的每一行可以循环形成 1,32,512,640 个立方体,然后可以使用np.concatenateor来构建 C np.vstack,例如:

但是我想知道是否可以使用类似的东西np.einsumnp.tensordot将其全部矢量化在一行中。我还在学习如何使用这两种方法,所以我不确定这里是否合适。

谢谢!