问题标签 [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 优化基本操作失败
随着最近对 Numpy (1.14) 的更新,我发现它破坏了我的整个代码库。这是基于将默认的 numpy einsum 优化参数从 False 更改为 True。
结果,以下基本操作现在失败:
带有以下错误跟踪:
我向 einsum 请求的操作看起来很简单……那为什么会失败呢?如果我设置“optimize=False”,它工作得很好。
我尝试使用 einsum_path 进行探索,但生成的路径信息在优化和不优化的情况下是相同的。
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 中运行相同的代码时
numpy - Numpy Einsum 路径差异和优化参数
我有以下张量执行,
而且我注意到,当“z”或“q”在维度上扩展时,执行时间确实会受到影响,尽管我的直觉是它可能不应该那么糟糕——也许这是我可以通过手动张量收缩来优化的输入形式。
经过一番挖掘,我看到优化有两种模式:“最佳”和“贪婪”。如果我分别针对两种模式评估我的路径:
和
如前所述,测试结果是“最佳”对我来说要快得多。
问题
谁能简单地解释一下区别是什么以及为什么将“贪婪”设置为默认值?
总是使用“最佳”的缺点是什么?
如果我的 einsum 计算要运行 1000 次(这是优化迭代的一部分),我是否应该重组执行以自动受益于“最佳”路径而无需重新计算(或“贪婪”路径)每次?
python - double np.einsum 的性能以及如何加速
考虑这个MWE:
my_func() 是我第一次尝试进行计算,但我想加快速度。然后我尝试了以下修改后的功能:
但是,当我%timeit
在这两个功能上运行时,我得到
为什么第二种方法比第一种慢?如何优化 my_func() 以使其更快?
python - `(N,M,M)` 矩阵的 Python `expm`
让我们A
成为一个(N,M,M)
矩阵(N
非常大),我想scipy.linalg.expm(A[n,:,:])
为每个n in range(N)
. 我当然可以只使用一个for
循环,但我想知道是否有一些技巧可以以更好的方式做到这一点(比如np.einsum
)。
对于其他操作,例如反转矩阵(反转在评论中解决),我有同样的问题。
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 相当的效率完成吗?
python - 点积 B^tDB 不返回对称数组
我正在尝试制作表达式的点积,它应该是对称的。
事实证明,事实并非如此。
B是一个 4D 数组,我必须将其最后两个维度转置为B ^t。
D是一个二维数组。(它是有限元方法程序员已知的刚度矩阵的表达式)
与第二个选择相关的numpy.dot
产品(这个想法来自这个主题:Numpy Matrix Multiplication U*B*UT Results in Non-symmetric Matrix)已经被使用并且问题仍然存在。numpy.transpose
numpy.einsum
在计算结束时,获得了乘积B ^t DB,当通过减去它的转置B ^t DB来验证它是否真的是对称的时,仍然有一个残差。
点积或爱因斯坦求和仅用于感兴趣的维度(最后一个)。
问题是:如何消除这些残留物?
python - 使用 numexpr 评估爱因斯坦求和
我目前正在处理大型 numpy 数组乘法,使用numpy.einsum
,并且一直面临MemoryError
问题。这就是为什么我试图在可能的情况下使用numexpr
. 据我所理解:
在技术上与
然而,在其他情况下,事情似乎并不那么简单。假设我有三个表达式:
使用 实现这三个的等效方法是numexpr
什么?
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
?
python - 将这两个向量相乘的大多数 Pythonic 方法?
我有两个形状的ndarray:
我需要将 A 和 B 相乘以获得新的 ndarray:
另一种思考方式是,向量 B 的每一行沿 A 的轴 =-2 相乘,得到一个新的 1,32,512,640 立方体。B 的每一行可以循环形成 1,32,512,640 个立方体,然后可以使用np.concatenate
or来构建 C np.vstack
,例如:
但是我想知道是否可以使用类似的东西np.einsum
或np.tensordot
将其全部矢量化在一行中。我还在学习如何使用这两种方法,所以我不确定这里是否合适。
谢谢!