2

我有一个类,其成员是通过累积实验数据中的值构建的数字列表,例如

 class MyClass:
     def __init__(self):
          container1 = []
          container2 = []
            ...

     def accumulate_from_dataset(self,dataset):
          for entry in dataset:
               container1.append( foo (entry) )
               container2.append( bar (entry) )
                  ...


     def process_accumulated_data(self):   
           '''called when all the data is gathered
           '''
           process1(container1)
           process2(container2)
             ...

问题:如果我可以将所有列表转换为 numpy 数组,那将是有益的。


我尝试了什么:简单的转换

    self.container1 = np.array(self.container1)

作品。虽然,如果我想考虑“一次拍摄更多领域”,比如

     lists_to_convert = [self.container1, self.container2, ...]

     def converter(lists_to_convert):
          for list in lists_to_convert:
               list = np.array(list)

由于对类成员的引用是按值传递的,因此没有任何有效的更改。


因此,我想知道是否有一种聪明的方法/解决方法来处理整个转换过程。

任何帮助表示赞赏

4

2 回答 2

2

来自实用程序员

问问自己:“必须这样做吗?必须这样做吗?

也许你应该重新考虑你的数据结构?也许一些字典或简单的列表列表会更容易处理?

请注意,在给出的示例中,container1container2只是初始的转换dataset。它看起来是列表理解的好地方:

foo_data = [foo(d) for d in dataset]
# or even
foo_data = map(foo, dataset)
# or generator version
foo_data_iter = (foo(d) for d in dataset)

如果您真的想像示例中那样对实例变量进行操作,请查看getattr内置hasattr函数

于 2013-09-02T15:29:40.317 回答
1

没有一种简单的方法可以做到这一点,因为正如您所说,python 通过“按值引用”

你可以在你的类中添加一个to_numpy方法:

class MyClass:
    def __init__(self):
        container1 = []
        container2 = []
        ...
def to_numpy(self,container):
    list = self.__getattr__(container)
    self.__setattr__(container,np.array(list))
        ...  

然后执行以下操作:

object = MyClass()

lists_to_convert = ["container1", "container2" ...]

def converter(lists_to_convert):
    for list in lists_to_convert:
        object.to_numpy(list)

但它不是很漂亮,而且这种代码通常会让我退后一步思考我的设计。

于 2013-09-02T15:09:58.453 回答