2014-02-25 57 views
0

我试图做的是用于显示一些numpy阵列提供了一个图形用户界面,及导线上的IPython这样你就可以,只要你喜欢操纵数据。我有所有的IPython的东西工作,问题是如何检测数组改变。检测到改变为numpy的阵列

显而易见的解决方案是显式调用某种refresh(),但我想即时反馈。绘制GUI是昂贵的(几秒钟),所以我不能在一个定时器上重绘。但是,我可以看起来在计时器上的数据,并重新绘制,如果它改变。

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

我能得到numpy的跟踪自己的“脏”标志?或者,是否有一些属性在变异数组后会有不同的id或其他内容?

+0

你能不能告诉阵列是否仅通过检测,将改变它的用户活动改变了吗? – user2357112

+0

这将有所帮助,但对于不通过IPython小部件的编程代码,我仍然需要围绕显式的'render()'调用。如果我们能够回答这个问题,它会使交互和编程接口相同,并希望更简单。 – Cuadue

+0

您的代码是否以这种方式工作,以显示数组的中间状态将会有用?渐进式渲染对网页来说很好,但对于您的情况,您可能无法在结果的第一位进入时与整个输出准备就绪之间更新显示。通话结束后,您可以更新显示屏。或者是一些其他线程同时修改阵列,而不是由用户输入定向? – user2357112

回答

2

你可能会忘记存储一些checksums并重新计算它们在计时器上以查找更改,或者只是保留副本并检查与np.all(a==b)的等同性。虽然这些方法不能很好地扩展。

一个解决方案making your array read-only,然后给用户一些突变方法,您可以调用refresh()

另一个想法是子类ndarray,包装相关的方法调用refresh()。这可能会非常棘手,因为有很多方法可以对numpy数组进行变异。

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

+0

我喜欢'hooks'方法。我可以在* IPython输入之前得到一些执行*的代码,但在*之后我找不到执行*的方法。任何想法? – Cuadue

+0

啊,看起来他们改变了v1.0的API。我对IPython内部知识不够了解。也许你应该问一个单独的问题,以引起一些IPython专家的注意。 – perimosocordiae