在编写一个接受用户输入数据并输出 NumPy 数组的类/函数时,需要构建一个输入数组。这个数组应该包括以下信息:
- zone_id - 数据库中的 ID,类型为整数。
- model size - 模型大小,类型为整数。
- type of analysis - 分析类型,可以是以下几种之一:
- type 1 - 整数或字符串。
- type 2 - 整数或字符串。
- type 3 - 整数或字符串。
- model purposes - 模型目的,类型为字符串数组。
- default: ONE、TWO、THREE(这只是目的的标题)。
- Custom: default + 其他(0 到 15 个目的)。
- Modeling step 1: 一些社会经济因素,类型为字典数组(字典的键是活动类型,如零售、非零售等,值是与该活动相关的数值)。
- Modeling step 2:
- Default: 零售/非零售方程系数,类型为字典(字典的键是活动类型,如零售、非零售等,值是与该活动相关的数值)。
- Custom: 由用户定义的每个额外活动方程系数,类型为字典数组(字典的键是活动类型,如零售、非零售等,值是与该活动相关的数值)。
一个示例数组如下:
def_array = (zone_id, model_size, analysis_type,
model_purpose[],
socio_economics[],
socio_coefficients[] )
一个数值示例如下:
my_arr = [np.array([ 10001, 1, 2,
[ 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE' ],
[ {'retail':500, 'non_retail':300, 'school':300', 'other':900} ],
[ {'retail':500, 'non_retail':300, 'school':300', 'other':900} ],
[ {'ONE':{'retail':.5, 'non_retail':1.7, 'school':.4', 'other':4.7},
{'TWO':{'retail':.2, 'non_retail':2.5, 'school':.5', 'other':4.3},
{'THREE':{'retail':.3, 'non_retail':2.3, 'school':.6', 'other':2.2},
{'FOUR':{'retail':.4, 'non_retail':1.1, 'school':.7', 'other':1.0},
{'FIVE':{'retail':7, 'non_retail':2, 'school':3', 'other':1} ] ])
这个数组将被插入到 3 个函数中,然后一起返回以下数组:
arr_results = [np.array([ 10001, one_1, TWO_1, THREE_1, FOUR_1, FIVE_1, ONE_2, TWO_2, THREE_2, FOUR_2, FIVE_2],
[10002, .... ,] ])
问题是,在定义输入数组时,最好的选择是什么?
2、解决方案
方法一:使用字典
NumPy 数组不适合这种场景,因为它们专为对大量相似数据(例如大型矩阵)进行数值操作而设计。在这个案例中,可以使用字典来存储数据,如下所示:
options = {
"zone_id": 10001,
"model_size": 1,
"analysis_type": 2,
"model_purposes": [ "ONE", ... ]
...
}
然后,可以通过将字典传递给函数,或者使用 ** 解包将其解包为命名参数,将字典传递给函数:
def do_stuff(zone_id=10001, model_size=1, ...):
...
do_stuff(**options)
方法二:使用自定义选项类
如果需要更复杂的数据类型(例如,如果需要动态计算某些选项或使某些选项依赖于其他选项),可以使用专门的选项类,如下所示:
class Options:
def __init__(self):
# set some default values
self.zone_id = 10001
def populate_values(self):
# maybe handle some user input?
self.name = input("name: ")
# use a property to calculate model_size on the fly
@property
def model_size(self):
return 2-1
然后,按如下方式使用该类:
```python
options = Options()
options.populate_values()
print(options.model_size)