使用numpy数组的sympy数字

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的符号表达式?

asm*_*rer 5

我怀疑与列表相比有很大的速度差异,因为在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数组上运行.