4

我正在使用 Python 的 traits 包,并且试图找出使用 traits.trait_numeric.Array 类的正确方法。用 Array trait 编写 traits.api.HasTraits 的子类很简单,这样当 Array 更改时,会触发 on_trait_change,但我不知道如何在修改数组元素时触发任何类型的事件到位。这是一个最小的例子:

from traits.api import HasTraits
from traits.trait_numeric import Array
import numpy as np

class C(HasTraits):
    x = Array
    def __init__(self):
        self.on_trait_event(self.do_something, 'x')
    def do_something(self):
        print 'Doing something'

c = C()

# This line calls do_something()
c.x = np.linspace(0,1,10)

# This one doesn't, and I wish it did
c.x[3] = 100

# Same with this one
c.x[:] = np.ones(c.x.shape)

我希望traits.trait_numeric.Array 有一些我不知道的内置功能,因为检测数组的一部分何时发生变化似乎是一件非常标准的事情。

除此之外,我认为可以通过创建一个也继承 numpy.array 的自定义 trait 类,然后更改 [] 运算符使其显式触发正确类型的 trait 事件来解决这个问题。但希望那是一罐我不必打开的蠕虫。

4

1 回答 1

8

恐怕这真的不可能。numpy 数组查看原始内存。任何东西都可以在不通过 numpy 数组对象本身的情况下更改该内存。我们通常使用的模式是在进行切片/索引分配之后重新分配整个数组。

import numpy as np
from traits.api import Array, HasTraits, NO_COMPARE


class C(HasTraits):
    x = Array(comparison_mode=NO_COMPARE)

    def _x_changed(self):
        print 'Doing something'


c = C()
c.x = np.linspace(0, 1, 10)

# This does not trigger:
c.x[3] = 100
# This does:
c.x = c.x
于 2013-09-03T08:31:12.723 回答