【问题标题】:Detecting a change to a numpy array检测对 numpy 数组的更改
【发布时间】:2023-04-11 03:32:02
【问题描述】:

我想要做的是提供一个 GUI 来显示一些 numpy 数组,并连接 IPython,以便您可以随心所欲地操作数据。我所有的 IPython 东西都在工作,问题是如何检测到数组发生了变化。

显而易见的解决方案是显式调用某种refresh(),但我希望得到即时反馈。绘制 GUI 很昂贵(几秒钟),所以我不能在计时器上重绘。但是,我可以查看计时器上的数据,如果发生变化则重绘。

我看到了一个关于 hashing the whole ndarray 的答案,这很有帮助,但是我的数组有点太大,而且散列太慢。我并不严格需要哈希,因为我不打算缓存或存储某些特定的数组。

我可以让 numpy 跟踪它自己的“脏”标志吗?或者,是否有一些属性在改变数组后会有不同的id 或其他东西?

【问题讨论】:

  • 您不能仅通过检测会更改数组的用户活动来判断数组是否已更改吗?
  • 这会有所帮助,但是对于不通过 IPython 小部件的编程代码,我仍然需要在显式的 render() 调用周围进行处理。如果我们能回答这个问题,它会使交互界面和编程界面相同,并且希望更简单。
  • 您的代码是否以显示数组中间状态的方式工作?渐进式渲染非常适合网页,但对于您的情况,甚至可能无法在您的结果的第一位进入和整个输出准备就绪之间更新显示。您可以在通话结束时更新显示。还是其他线程同时修改数组,而不是由用户输入指导?

标签: python numpy


【解决方案1】:

您也许可以通过存储一些checksums 并在计时器上重新计算它们以查找更改,或者只是保留一份副本并检查与np.all(a==b) 的相等性。不过,这些方法无法很好地扩展。

一个解决方案making your array read-only,然后为用户提供一些突变方法,您已将其称为refresh()

另一个想法是继承ndarray,用调用refresh()包装相关方法。这可能很棘手,因为有很多方法可以改变 numpy 数组。

最后,您可以提供一个自定义 IPython 配置文件,该配置文件在每个用户命令之后调用 refresh()。这似乎是最简单的方法,因为您可以使用现有的 hooks 模块来插入您的调用。

【讨论】:

  • 我喜欢hooks 方法。我可以获得一些代码来执行before IPython 输入,但我找不到如何执行after。有什么想法吗?
  • 啊,看来他们更改了 v1.0 的 API。我对 IPython 内部的了解还不够多。也许你应该把它作为一个单独的问题提出来引起一些 IPython 专家的注意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 2017-03-04
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多