python - 我如何让 numpy.einsum 与 sympy 一起玩?

标签 python numpy nested sympy

好的,所以我有几个 sympy 对象(表达式)的多维 numpy 数组。例如:

A = array([[1.0*cos(z0)**2 + 1.0, 1.0*cos(z0)],
          [1.0*cos(z0), 1.00000000000000]], dtype=object)

等等。

我想做的是使用 einsum 将这些数组中的几个相乘,因为我已经从我之前进行的数值计算中获得了相应的语法。问题是,当我尝试做类似的事情时

einsum('ik,jkim,j', A, B, C)

我收到类型错误:

TypeError: invalid data type for einsum

当然,在 Google 上快速搜索显示 einsum 可能无法执行此操作,但没有理由说明原因。特别是,在这些数组上调用 numpy.dot() 和 numpy.tensordot() 函数就像一个魅力。我可以使用 tensordot 来做我需要的事情,但是当我想到必须用嵌套替换上面的五十个左右的 Einsten 求和(其中索引的顺序非常重要)时,我的大脑很痛张量点调用。更可怕的是必须调试该代码并寻找那个放错位置的索引交换。

长话短说,有谁知道为什么 tensordot 可以处理对象而 einsum 不行?对解决方法有什么建议吗?如果没有,关于我将如何编写自己的包装器以嵌套张量点调用的任何建议,这有点类似于 einsum 表示法(数字而不是字母很好)?

最佳答案

Einsum 基本上取代了 tensordot(不是 dot,因为 dot 通常使用优化的线性代数包),在代码方面它是完全不同的。

这是一个对象 einsum,它未经测试(对于更复杂的事情),但我认为它应该可以工作......在 C 中做同样的事情可能更简单,因为你可以从真正的 einsum 中窃取除了循环本身之外的所有东西功能。因此,如果您喜欢它,请实现它并让更多人开心...

https://gist.github.com/seberg/5236560

我不会保证任何事情,尤其是对于更奇怪的极端情况。当然,我敢肯定,您也可以将 einsum 表示法转换为 tensordot 表示法,这可能会快一点,因为循环最终将主要使用 C 语言...

关于python - 我如何让 numpy.einsum 与 sympy 一起玩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15606937/

相关文章:

javascript - 遍历嵌套的javascript对象以识别空值属性

python - 将 value-dict 重新映射到 Pandas 中的列

python - 在 2d python 列表中附加值

python - Numpy 在行上循环追加二维数组

java - 关闭嵌套流也会关闭其父流吗?

mysql - 嵌套 SQL 查询

python - 并行执行具有不同参数的相同 Python 程序

python - 根据输入执行查找时出现问题

python-3.x - Keras 并行层的串联改变了所需的目标形状

python - 使用Python计算使用五个点的唯一圆锥截面