Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.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 numpy集成存在-记录在哪里?_Python_Numpy_Sympy - Fatal编程技术网

Python Sympy numpy集成存在-记录在哪里?

Python Sympy numpy集成存在-记录在哪里?,python,numpy,sympy,Python,Numpy,Sympy,我只是偶然发现我可以将sympy表达式与numpy数组混合在一起: >>> import numpy as np >>> import sympy as sym >>> x, y, z = sym.symbols('x y z') >>> np.ones(5)*x array([1.0*x, 1.0*x, 1.0*x, 1.0*x, 1.0*x], dtype=object) # I was expecting this t

我只是偶然发现我可以将sympy表达式与numpy数组混合在一起:

>>> import numpy as np
>>> import sympy as sym
>>> x, y, z = sym.symbols('x y z')
>>> np.ones(5)*x
array([1.0*x, 1.0*x, 1.0*x, 1.0*x, 1.0*x], dtype=object)
# I was expecting this to throw an error!

# sum works and collects terms etc. as I would expect
>>> np.sum(np.array([x+0.1,y,z+y]))
x + 2*y + z + 0.1
# dot works too
>>> np.dot(np.array([x,y,z]),np.array([z,y,x]))
2*x*z + y**2
>>> np.dot(np.array([x,y,z]),np.array([1,2,3]))
x + 2*y + 3*z
这对我来说非常有用,因为我在同一个程序中进行数值和符号计算。然而,我对这种方法的缺陷和局限性感到好奇——例如,似乎在包含Symphy对象的Numpy数组上既不支持
np.sin
也不支持
sym.sin
,因为两者都会给出错误

然而,这种numpy-sympy集成似乎在任何地方都没有记录。这只是这些库如何实现的一个意外,还是一个故意的特性?如果是后者,何时设计使用,何时使用
sympy.Matrix
或其他解决方案更好?在处理这种数组时,我能保持numpy的一些速度吗?还是只要涉及到sympy符号,它就会回到Python循环


简言之,我很高兴发现这个功能的存在,但我想知道更多关于它

这只是NumPy对对象数组的支持。它不是针对SymPy的。NumPy检查操作数并发现并非所有操作数都是标量;涉及到一些物体。因此,它调用该对象的
\uuuuMul\uuuu
\uuurmul\uuuuuu
,并将结果放入一个对象数组中。例如:mpmath对象

>>> import mpmath as mp
>>> np.ones(5) * mp.mpf('1.23')
array([mpf('1.23'), mpf('1.23'), mpf('1.23'), mpf('1.23'), mpf('1.23')],
      dtype=object)
或列表:

>>> np.array([[2], 3])*5
array([list([2, 2, 2, 2, 2]), 15], dtype=object)
>>> np.array([2, 3])*[[1, 1], [2]]
array([list([1, 1, 1, 1]), list([2, 2, 2])], dtype=object)
在使用这种阵列时,我能保持numpy的速度吗

不,NumPy对象数组没有Python列表的性能优势;访问元素的开销可能比在列表中要大


如果有更具体的数据结构可用,就没有理由使用这种数组。

我刚刚在最新的
numpy
发行说明()

我认为这意味着这是可行的,但以前没有:

In [9]: np.array([x+.1, 2*y])==np.array([.1+x, y*2])
Out[9]: array([ True,  True])

你可以检查sympy numpy兼容性@bro grammer谢谢,所以这绝对是一个精心设计的功能,那么
numpy
不知道。但似乎
sympy
提供了足够的方法,当在对象数据类型数组中使用时,其对象的行为非常类似于数字标量。对象数组的数学运算速度较慢,其覆盖率也比较准确(与常规的数字数据类型数组相比)。有关使用对象数据类型数组进行数学运算的详细信息:。这有助于解释为什么乘法有效,但sin却不行。
In [9]: np.array([x+.1, 2*y])==np.array([.1+x, y*2])
Out[9]: array([ True,  True])