【问题标题】:Convert a numpy array to iterator将 numpy 数组转换为迭代器
【发布时间】:2019-06-20 22:26:51
【问题描述】:

我想使用一个数组作为函数的参数,该函数将用于求解 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]

【问题讨论】:

  • 为什么不只是一个for 循环?
  • 因为如果我在 read_tau() 中使用 for 循环,它将无法在 ODE 时间步返回值。我实际上不知道 odeint 是如何工作的。我只是想确保每当 odeint 访问 tau_arr 时,它将一次访问一行。
  • 你试过tau_arr = iter(raw_tau_array)吗?
  • 它有效。谢谢。
  • odeint 使用具有自适应时间步长的预测校正方法。即使它有效,你的方法也将毫无用处。如果您还有采样时间列表,唯一明智的方法是插入 tau_arr。

标签: python arrays numpy iterator ode


【解决方案1】:

您想要的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 数组。谢谢。
  • 这一切都很好,其他人可能同样的问题,现在他们可以找到答案了。
  • 这也可以通过np.nditer 实现吗?试图阅读文档,但它似乎有点矫枉过正。
  • @jpp,是的,nditer 在做更复杂的事情时很棒,因为它不是 Python 循环。但是在这个 ODE 求解器很容易成为瓶颈的简单迭代中,我怀疑它在这里有什么价值。
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2012-05-07
  • 2018-09-28
  • 2011-09-02
  • 1970-01-01
相关资源
最近更新 更多