0

我从 python 中的 sympylambdify函数创建了一个 ndarray,我需要的实际值隐藏在我的结果变量的这个数组字段中。需要明确的是,array沿的每个索引axis=0对应于特定时刻的 7 阶时间多项式的一阶导数:

在此处输入图像描述

在我的 lambdify 函数中,我传递了一个大小为 33 的元素时间向量,并期待一个 8x33 或 33x8 的结果,但相反,它将我的输出推送到这个数组字段,我很难访问它。现在,我只能通过执行result[0],result[1]等来访问它,但这很乏味,因为我一次只能访问所有内容,这意味着循环是访问所有内容的唯一方法。这不是我期望的 ndarray 的行为:

在此处输入图像描述

有人可以解释这里发生了什么,如果可能的话,我如何访问这个数组字段以便我可以向量化任何后续操作?我的目标是沿axis = 0堆叠数组中的每个元素并计算后续导数并根据它们各自的时间堆叠它们。

4

1 回答 1

0

函数的doc显示lambdified实际numpy代码。有时看看它会有所帮助。

破译您的内容需要png一些时间(我们通常不喜欢 SO 上的那些)。我想这是数组的pydev显示。result它看起来像一个形状 (8,) 对象 dtype 数组。大多数元素是形状 (33,) 数组,但最后 2 个是标量。

np.stack(result[:6])

应该产生一个 (8,33) 数字 dtype 数组。

对象 dtype 数组很像一个列表,其中包含对不同元素的引用。

查看您的多项式,我猜lambdified函数返回如下内容:

np.array([7*t**6, ..., 2*t, 1, 0])

虽然其中 6 个术语包括t,但最后 2 个不包括。包含的术语t将产生一个 (33,) 数组。 sympy.lambdify是一个相对简单的函数,执行从sympy到的词汇翻译numpy。它没有对numpy.


例子:

In [25]: exp = (3*t**3,2*t**2,1*t,1.0,0)
In [26]: f = lambdify(t, exp)
In [27]: print(f.__doc__)
Created with lambdify. Signature:

func(t)

Expression:

(3*t**3, 2*t**2, t, 1.0, 0)

Source code:

def _lambdifygenerated(t):
    return ((3*t**3, 2*t**2, t, 1.0, 0))

In [28]: f(np.arange(3))
Out[28]: (array([ 0,  3, 24]), array([0, 2, 8]), array([0, 1, 2]), 1.0, 0)
In [29]: np.array(_)
<ipython-input-29-7a2cd91c32ca>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
  np.array(_)
Out[29]: 
array([array([ 0,  3, 24]), array([0, 2, 8]), array([0, 1, 2]), 1.0, 0],
      dtype=object)
于 2021-03-26T00:57:16.580 回答