Как объявить типизированный Dict, значение которого является вложенным списком в numba - PullRequest
0 голосов
/ 31 октября 2019

Здравствуйте, я знаю, что у numba есть numba.typed.Dict, который является типизированным dict, но значение моего dict является списком списка, каждый ключ в dict может иметь разную длину внешнего списка;также каждый внутренний список может иметь различную длину;тип внутреннего списка - пара float32. Мне интересно, поддерживает ли numba такую ​​структуру и как ее объявить?

Пример словаря приведен ниже

{
    “Seattle”: [[[1.2, 3.5], [4.5, 6.7]]],
    “New York”:[ [[5.7, 22.4], [3.5, 7.8], [6.9, 4.1]], [[2.3, 4.5]]],
    “Boston”: [[[2.4, 5.0]]]
}


region_polygons = Dict.empty(
key_type=types.unicode_type,
value_type=  <------ try to figure out this )

1 Ответ

1 голос
/ 01 ноября 2019

Мы можем воспользоваться Типизированными списками , которые поддерживают вложенность . Я использую List(lsttype=...), чтобы вручную указать тип, который, к сожалению, официальные документы не показывают, но имейте в виду, что типизированные списки в настоящее время являются экспериментальной функцией (v 0.47) и могут быть изменены в более поздних выпусках.

>>> from numba.typed import Dict, List
>>> from numba.types import float32, unicode_type, ListType

>>> py_dct = {
...     "Seattle": [[[1.2, 3.5], [4.5, 6.7]]],
...     "New York":[ [[5.7, 22.4], [3.5, 7.8], [6.9, 4.1]], [[2.3, 4.5]]],
...     "Boston": [[[2.4, 5.0]]]
... }

>>> nested_3 = ListType(ListType(ListType(float32)))
>>> nested_2 = ListType(ListType(float32))
>>> nested_1 = ListType(float32)

>>> nb_dct = Dict.empty(
...     key_type=unicode_type,
...     value_type=nested_3,
... )

>>> for city, lst in py_dct.items():
...     out_lst = List(lsttype=nested_3)
...     for outer in lst:
...         mid_lst = List(lsttype=nested_2)
...         for middle in outer:
...             in_lst = List(lsttype=nested_1)
...             for inner in middle:
...                 in_lst.append(inner)
...             mid_lst.append(in_lst)
...         out_lst.append(mid_lst)
...     nb_dct[city] = out_lst

>>> nb_dct['Seattle']
ListType[ListType[ListType[float32]]]([[[1.2000000476837158, 3.5], [4.5, 6.699999809265137]]])

>>> nb_dct['New York']
ListType[ListType[ListType[float32]]]([[[5.699999809265137, 22.399999618530273], [3.5, 7.800000190734863], [6.900000095367432, 4.099999904632568]], [[2.299999952316284, 4.5]]])

>>> nb_dct['Boston']
ListType[ListType[ListType[float32]]]([[[2.4000000953674316, 5.0]]])
...