将numpy数组转换为迭代器

7
我想将一个数组作为函数的参数,用于解决ODE函数。
def ode(x, t, read_tau, tau_arr):
  q_ib = x[0:4]
  omega = x[4:7]

  dq_ib = 0.5 * np.dot(gen_omega(omega), q_ib) + read_tau(tau_arr)

  return dq_ib

dq_ib = odeint(rhs, x0, t, args=(b_I, read_tau, tau_arr))

而 tau_arr 是一个 (1000, 3) 的数组。我能想到的唯一解决方案是首先将 tau_arr 转换为迭代器,然后在 read_tau() 中使用。

def read_tau(tau_arr):
  return next(tau_arr)

read_tau函数的返回值将是一个1x3数组,用于解决ODE问题。

我的问题是如何将一个二维数组转换成迭代器,并且在调用next()时,它会逐行返回一个数组。

a = np.array([[1,2,3], [4,5,6]])
convert_to_iter(a)
next(a)
[1,2,3]
next[a]
[4,5,6]

1
为什么不用一个 for 循环呢? - Stephen Rauch
因为如果我在read_tau()中使用for循环,它将无法在ODE时间步长返回一个值。实际上,我不知道odeint是如何工作的。我只想确保每当odeint访问tau_arr时,它将一次访问一行。 - Lion Lai
你尝试过 tau_arr = iter(raw_tau_array) 吗? - Stephen Rauch
它可以工作。谢谢。 - Lion Lai
1
odeint使用自适应时间步长的预测校正方法。即使它能工作,你的方法也是无用的。唯一明智的方法是在有样本时间列表的情况下插值tau_arr。 - Lutz Lehmann
1个回答

13

你所需要的convert_to_iter()函数是Python内置的iter()函数。

> a = iter(np.array([[1,2,3], [4,5,6]]))
> next(a)
[1,2,3]
> next[a]
[4,5,6]

我只知道iter()适用于列表,发帖前我应该尝试过np数组。谢谢。 - Lion Lai
没问题,可能还有其他人会问同样的问题,现在他们可以找到答案了。 - Stephen Rauch
这个也可以通过 np.nditer 实现吗?尝试阅读文档,但似乎有点过度。 - jpp
1
@jpp,没错,当需要进行更复杂的操作时,nditer非常好用,因为它不是Python循环。但在这种简单的迭代中,ODE求解器很可能成为瓶颈,我怀疑它在这里没有任何价值。 - Stephen Rauch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接