Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SymPy:lambdified dot()与(3,n)-数组_Python_Numpy_Sympy - Fatal编程技术网

Python SymPy:lambdified dot()与(3,n)-数组

Python SymPy:lambdified dot()与(3,n)-数组,python,numpy,sympy,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(

我有一个
lambdify
d 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')
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)
这一点和你最初的胡言乱语之所以有效,是因为你所要做的就是拥有一个写着“
dot
”的东西。一旦你有了它,
lambdify
将把
np.dot
替换为你符号的那部分

现在,为了完整起见,我会这样做:

import numpy as np

a = np.array([[1],[1],[1]])
ff = lambda x,a=a: np.dot(x,a)
我知道这在你的实际问题中可能不是一个选项,但我的经验是,如果没有符号数学就可以做一些事情,那么像这样做是值得的

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

您应该做的是在数字端转置
x

x = np.random.rand(3,10)
print(ff(x.T))
这将在函数中输入一个shape
(10,3)
数组,然后将其乘以shape
(3,1)
中的一个,得到一个shape
(10,1)
的2d数组:一个列向量,如果给定的输入向量具有
a
,则每行包含标量积

另一个选项是交换函数的定义:

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')
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个标量积的一维数组。
在这个公式中,你的

哦,嘿,我不知道你是matlab2tikz的作者。太棒了!:)谢谢如果你想提高你的阴谋游戏,请查看。