我宣布了一个类,并且在__init__
方法中,我宣布了两个与该类实例相关联的变量。每个声明的变量都初始化为NumPy零数组,稍后会用其他数据填充。
在某些时候,在这个__init__
方法之外,我需要遍历一个包含这些变量(NumPy数组)的对象,并将每个变量中的数组值重置为零。因此,在__init__
方法中,我想将所有这些变量添加到列表中以便稍后迭代。如果我手动执行此操作,那就非常简单。
但是,我需要经常添加和删除__init__
中声明的一些变量。每次我这样做,我都不想手动调整列表中包含的变量。
如何创建这些变量的list
,dict
或其他容器,这些变量会自动调整自身,使其包含所有这些初始化的变量,而不管这些变量的数量是多少?作为额外的复杂因素,self.container_of_arrays
不得包含"其他"来自__init__
的变量,例如self.array_length
。
我有什么,如果创建self.container_of_arrays
,目前必须手动调整self.my_variable_three
:
class generic_class():
def __init__(self, array_width_one, array_width_two):
self.array_length = some_integer
self.my_variable_one = numpy.zeros((self.array_length, array_width_one), dtype=float)
self.my_variable_two = numpy.zeros((self.array_length, array_width_two), dtype=float)
self.container_of_arrays = [self.my_variable_one, self.my_variable_two]
我试图在dict
内声明我的变量,因此从一开始它们就包含在dict
中,但是这会导致对未定义变量的引用。 E.g。
self.container_of_arrays = OrderedDict([(self.my_variable_one, numpy.zeros((self.array_length, array_width_one), dtype=float)),
(self.my_variable_two, numpy.zeros((self.array_length, array_width_two), dtype=float))
])
更新
xli的回答提供了正确的解决方案。如建议的那样,可以使用dict或OrderedDict按名称访问数组。对于任何想要这样做的人,请参阅我实际执行的代码:
my_data = [('variable_one_name', len(variable_one_data)),
('variable_two_name', len(variable_two_data)),
] # Intentionally outside the class in a location where variables are added by the user
class generic_class():
def __init__(self, array_length, my_data):
self.container_of_arrays = OrderedDict((variable_name, numerix.zeros((array_length, array_width), dtype=float))
for variable_name, array_width in my_data)
答案 0 :(得分:1)
为什么不创建包含所需数组的数组列表,而不是为每个numpy数组创建一个变量,而不是通过索引引用它们?
class generic_class():
def __init__(self, array_length, array_widths=[]):
self.array_length = array_length
self.arrays = [
numpy.zeros((self.array_length, array_width), dtype=float)
for array_width in array_widths
]
然后,您可以按索引访问每个数组self.arrays[i]
。
或者,如果您需要按名称访问数组,则可以使用仅包含字符串(数组名称)的dict作为每个数组的键。