python - SymPy:lambdified dot() with (3,n)-array

标签 python numpy sympy

我有一个 lambdifyd sympy 函数,里面有一个 dot 产品,例如,

import numpy as np
import sympy


class dot(sympy.Function):
    pass


x = sympy.Symbol('x')
a = sympy.Matrix([1, 1, 1])
f = dot(x, a)

ff = sympy.lambdify((x), f, modules='numpy')

x = np.random.rand(3)
print(ff(x))  # okay

(奇怪的是,自定义 dot 声明有效。不知道确切原因,但没关系。如果有更好的解决方案,请告诉我。)

我现在想一次用一堆向量调用 ff,所以我去了

x = np.random.rand(3, 10)
print(ff(x))

不好!

ValueError: shapes (3,10) and (3,1) not aligned: 10 (dim 1) != 3 (dim 0)

好吧,所以我必须以某种方式转置 dot 的第一个参数。在 sympy.Symbol('x') 上使用旧的 .T 是不合法的。

关于如何从 lambdified sympy 表达式进行大量点积的任何提示?

最佳答案

您正在做很多奇怪的事情,但我无法判断其中有多少是由于过于简化的 MCVE。

首先,对您的函数进行更优雅的定义:

import sympy as sym    

x = sym.Symbol('x')
a = sym.Matrix([1, 1, 1])
dot = sym.Function('dot')
f = dot(x, a)

ff = sym.lambdify(x, f, modules='numpy')

这和您原来的拼凑之所以有效,是因为您所要做的就是拥有写着“”的东西。一旦你有了它,lambdify 将用 np.dot 替换你符号的那部分。

现在,为了完整起见,这里是我应该如何做的:

import numpy as np

a = np.array([[1],[1],[1]])
ff = lambda x,a=a: np.dot(x,a)

我知道这在您的实际问题中可能不是一个选项,但我的经验是,如果无需符号数学就可以完成某些事情,那么这样做是值得的。

现在,为你的错误。错误很明显,数学也是如此。您定义了一个函数,该函数针对任何输入 x 使用 3d 列向量 a 计算 x*a。正如错误所暗示的那样,这在非常有限的情况下才有意义。如果两个操作数都是 3 元素一维数组,这将是有意义的,在这种情况下,将返回标量积。但是,由于您的操作数之一固定为形状 (3,1)np.dot 仅执行矩阵乘法(并且对于向量输入,返回 1 元素 1d数组而不是标量)。根据您的定义,它仅适用于可以从右边乘以 a 的矩阵,即形状为 (N,3) 的矩阵。显然,您输入的情况并非如此。

应该做的是在数字方面转置x:

x = np.random.rand(3,10)
print(ff(x.T))

这会将形状为 (10,3) 的数组输入到函数中,然后将其乘以形状为 (3,1) 的数组,得到形状为 (10,1) 的二维数组:一个列向量,如果给定的输入向量具有 a,则每行包含标量积。

另一种选择是交换函数的定义:

f = dot(a.T,x)
ff = sym.lambdify(x, f, modules='numpy')
# or
a = np.array(1,1,1)  # transpose of previous a
ff = lambda x,a=a: np.dot(a,x)

两者都将创建一个函数,将右侧的形状数组 (1,3) 与输入相乘。那么你输入的形状为(3,10)x就直接兼容了;输出将是 10 个标量积的一维数组。 在这个公式中你的

关于python - SymPy:lambdified dot() with (3,n)-array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38269304/

相关文章:

python - 在 Pandas 中,有没有办法将一个单元格除以一列中的所有其他单元格?

python - 在 Python/pandas 中使用正则表达式查找城市名称

python - 递归地为给定的文件名 Pylint

python - 使用 numpy.load 时遇到问题

python - 如何从 PyDev Django shell 运行 createsuperuser

Python:从不同大小和 dtype 的单独列表创建 N 维列表

python - 迭代删除 numpy 数组中的行

python - Python 中具有位置相关西格玛的二维图像高斯滤波器

python - 如何为预定义方程中的变量分配新值?

python - 简化使用 sympy codegen 生成的表达式