繁体   English   中英

使用numpy数组的sympy数字

[英]Using numpy arrays of sympy numbers

在使用符号表达式数组时,使用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 ,这意味着数组只是一个指针数组( list也是)。

目前还不清楚为什么要使用NumPy阵列?

第一个问题是,你为什么不想使用float64 假设你正在使用

  • 符号表达式(例如x**2pi ),
  • 理性数字,或
  • 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数组上运行。

我认为如果需要,可以使用numpy数组。 您应该记住,数组与列表根本不同。 最重要的是,所有数组元素必须属于同一类型,并且您无法更改类型。

特别是,您定义了数组u0 ,默认情况下是浮点数组。 这就是为什么你不能给它分配任何sympy对象的原因。

我自己使用numpy数组来容纳sympy表达式。 最值得注意的是,在我需要超过2维的情况下,因此不能使用Sympy矩阵。

如果使用数组而不是列表的唯一原因是速度,则可能不建议。 特别是,因为你必须对类型有点小心(正如你所发现的)并且在使用列表或者更喜欢sympy.Matrix时应该会有更少的惊喜。

在您的示例中,您可以通过定义正确的数据类型来解决问题:

u = np.zeros((10, 3), dtype=sp.Symbol)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM