我有一个类,其成员是通过累积实验数据的值构建的数字列表,如
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)
由于对类成员的引用是按值传递的,因此没有任何有效的更改。
我想知道是否有一种智能方法/解决方法来处理整个转换过程。
任何帮助表示赞赏
答案 0 :(得分:2)
问问自己:"是否必须这样做?是否必须完成?
也许您应该重新考虑您的数据结构?也许某些字典或简单的列表列表会更容易处理?
请注意,在提供的示例中,container1
和container2
只是初始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
内置函数
答案 1 :(得分:1)
没有一种简单的方法可以做到这一点因为你说python传递“by-reference-by-value”
您可以在班级中添加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)
但它不是很漂亮,这种代码通常会让我退后一步思考我的设计。