D1X*_*D1X 2 python numpy sympy python-3.x
在使用符号表达式数组时,使用numpy数组是否明智?
就像是
u0=numpy.array([Number(1.0), Number(1.0), Number(1.0)])
我的意思是,使用numpy数组而不是python列表会更快吗?
如果是这样,具有numpy数组的某些操作似乎会自动转换为浮动符号表达式,例如:
u0=np.array([Number(1.0), Number(1.0), Number(1.0)])
u = np.zeros((10, 3))
u[0] = u0
现在虽然
type(u0[0])>> sympy.core.numbers.Float,
type(u[0][0]) >> numpy.float64
如何避免numpy转换复制到float64的符号表达式?
我怀疑与列表相比有很大的速度差异,因为在NumPy数组中使用任何非NumPy数据类型(即任何SymPy数据类型)都会导致dtype=object,这意味着数组只是一个指针数组(a list也是如此).
目前还不清楚为什么要使用NumPy阵列?
第一个问题是,你为什么不想使用float64?假设你正在使用
x**2或pi),sympy.Float 具有更高精度的对象这些是我能想到的唯一原因,你想要更喜欢SymPy类型而不是NumPy类型.
使用NumPy数组的主要优点是,如果您想利用NumPy的卓越索引语法.正如Stelios指出的那样,你可以通过使用SymPy的张量模块来获得更多.这实际上是使用它们的唯一原因,您必须小心并注意哪些NumPy方法/功能将起作用,哪些不起作用.
原因是任何NumPy数学函数都不起作用(或者最好将数组转换为float64第一个).原因是NumPy函数被设计用于NumPy数据类型.他们不了解上述数据类型.要获得精确值(符号表达式或有理数)或更高精度的浮点值(对于大小写sympy.Float),您需要使用SymPy函数,这些函数不适用于NumPy数组.
如果另一方面(再次,不清楚你究竟想要做什么),你想在SymPy中进行计算,然后使用NumPy函数来数值计算表达式,你应该使用SymPy来创建你的表达式,然后lambdify(或者ufuncify如果性能成为问题)将表达式转换为等效的NumPy函数,这些函数可以在NumPy dtypes的NumPy数组上运行.