当我声明像这样的符号和数组时
t = symbols('t')
v1 = np.array([[1, 2, 3, 4, 5, ]])
print( type(v1) )
我在阵列里放了一个符号
v2 = v1.dot(t)
print( type(v2) )
问题1:如果v2内部有一个符号,为什么它仍然是numpy.ndarray?
当我尝试集成这个阵列时,我无法做到
# I1 = integrate( v2 , t ) # this cannot be integrate because...
# AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'as_poly'
然后,我必须做这个
v3 = smp.Matrix( v2 )
I2 = integrate( v3 , t )
问题2:
有没有另一种方法可以积分v2,而不必在sympy矩阵中更改它?
sympy
和numpy
未集成。sympy
对象在数组中工作,它们可以被视为"对象",并具有适当的方法。否则,numpy
不会对sympy
对象执行任何特殊操作。
在isympy
会话中:
In [200]: t
Out[200]: t
In [201]: tau
Out[201]: τ
带有符号的数组将是object
数据类型。这就像一个列表,其中引用了这些数字和对象。这不是一个特殊的数组数据类型:
In [202]: arr = np.array([1,2,tau,t])
In [203]: arr
Out[203]: array([1, 2, tau, t], dtype=object)
np.dot
之所以有效,是因为符号可以相加和相乘:
In [204]: np.dot(arr,arr)
Out[204]:
2 2
t + τ + 5
In [205]: type(_)
Out[205]: sympy.core.add.Add
具有两个匹配1d阵列的CCD_;标量";,在这种情况下是CCD_ 10对象。
对于具有匹配大小的数字列表的点相同:
In [206]: np.dot([1,2,3,4],arr)
Out[206]: 4⋅t + 3⋅τ + 5
In [207]: type(_)
Out[207]: sympy.core.add.Add
但具有标量tau
的3元素列表的点产生一个数组:
In [208]: np.array([1,2,3]).dot(tau)
Out[208]: array([tau, 2*tau, 3*tau], dtype=object)
(3,4(与(4,(的点产生(3,(阵列:
In [210]: np.ones((3,4),int).dot(arr)
Out[210]: array([t + tau + 3, t + tau + 3, t + tau + 3], dtype=object)
CCD_ 12也不";知道";关于numpy
,所以integrate(ndarray, ...)
不起作用并不奇怪。
错误# AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'as_poly'
表示数组已转换为ImmutableDenseNDimArray
sympy对象。在不详细说明的情况下,这显然是用于此目的的错误类型的症状对象。
使用v2
:
In [220]: v2
Out[220]: array([[t, 2*t, 3*t, 4*t, 5*t]], dtype=object)
In [222]: Matrix(v2)
Out[222]: [t 2⋅t 3⋅t 4⋅t 5⋅t]
In [225]: type(_222)
Out[225]: sympy.matrices.dense.MutableDenseMatrix
In [227]: ImmutableDenseNDimArray(v2)
Out[227]: [[t 2⋅t 3⋅t 4⋅t 5⋅t]]
In [228]: type(_)
Out[228]: sympy.tensor.array.dense_ndim_array.ImmutableDenseNDimArray
这两者都没有as_poly
方法,但integrate
可能正在进行一些进一步的处理。numpy
有一个主类ndarray
,它具有一组众所周知的方法和属性。sympy
定义了更多的类,所以我们(I(需要更多地关注文档。这两个类(type(...).__mro__
(的类层次结构完全不同。
使用Matrix
,集成运行并生成:
In [235]: integrate(Matrix(v2),t)
Out[235]:
⎡ 2 2 2⎤
⎢t 2 3⋅t 2 5⋅t ⎥
⎢── t ──── 2⋅t ────⎥
⎣2 2 2 ⎦
如果你提供了这个输出,那就太好了(礼貌!(。
对于不起作用的情况,完整的回溯可能会很有启发性:
In [236]: integrate(ImmutableDenseNDimArray(v2),t)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-236-fbba47abf5a1> in <module>
----> 1 integrate(ImmutableDenseNDimArray(v2),t)
/usr/local/lib/python3.6/dist-packages/sympy/integrals/integrals.py in integrate(*args, **kwargs)
1543
1544 if isinstance(integral, Integral):
-> 1545 return integral.doit(**doit_flags)
1546 else:
1547 new_args = [a.doit(**doit_flags) if isinstance(a, Integral) else a
/usr/local/lib/python3.6/dist-packages/sympy/integrals/integrals.py in doit(self, **hints)
592 else:
593 antideriv = self._eval_integral(
--> 594 function, xab[0], **eval_kwargs)
595 if antideriv is None and meijerg is True:
596 ret = try_meijerg(function, xab)
/usr/local/lib/python3.6/dist-packages/sympy/integrals/integrals.py in _eval_integral(self, f, x, meijerg, risch, manual, heurisch, conds)
921
922 # try to convert to poly(x) and then integrate if successful (fast)
--> 923 poly = f.as_poly(x)
924 if poly is not None and not (manual or meijerg or risch):
925 return poly.integrate().as_expr()
AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'as_poly'
我们需要深入研究这段代码(922行(,找出它尝试f.as_poly
的原因。它是否也尝试过Matrix
,或者采取了不同的路线?sympy
代码中有很多类似的内容!
您一开始不需要使用np.array
。坚持sympy
:
In [249]: integrate(Matrix([[1,2,3,4,5]])*t,t)
Out[249]:
⎡ 2 2 2⎤
⎢t 2 3⋅t 2 5⋅t ⎥
⎢── t ──── 2⋅t ────⎥
⎣2 2 2 ⎦