Python中的矢量化字典

时间:2018-03-15 10:11:12

标签: python numpy

Python中是否有任何包提供使用NumPy数组进行矢量化访问的字典?我正在寻找这样的东西:

>>> vector_dict = VectorizedDict({1: "One",
...                               2: "Two",
...                               3: "Three"},
...                               dtype_key=int, dtype_val="U5")
>>> a = np.array([1,2,3]),
>>> b = vector_dict[a]
>>> print(type(b))
np.ndarray
>>> print(b)
["One", "Two", "Three"]

虽然通过迭代数组元素也可以实现这个结果,但对于大型数组,迭代方法效率相当低。

编辑:

对于小词典,我使用以下方法:

for key, val in my_dict.items():
    b[a == key] = val

尽管在迭代小字典时布尔掩码非常有效,但对于大型字典(数以千计的键值 - 巴黎)而言,这是非常耗时的。

3 个答案:

答案 0 :(得分:3)

Pandas数据结构为1D(pd.Series),2D(pd.DataFrame)和3D(pd.Panel)数据实现此功能:

import numpy as np
import pandas as pd

s = pd.Series(data=['One', 'Two', 'Three'], index=[1, 2, 3])
a = np.array([1, 2, 3])
b = s[a]
print(b.values)
['One' 'Two' 'Three']

对于更高维度的结构,您有xarray

答案 1 :(得分:2)

以下是两种方法 -

def lookup_dict_app1(vector_dict, a):
    k = np.array(list(vector_dict.keys()))
    v = np.array(list(vector_dict.values()))
    sidx = k.argsort()
    return v[sidx[np.searchsorted(k,a,sorter=sidx)]].tolist()

def lookup_dict_app2(vector_dict, a):
    k = np.array(list(vector_dict.keys()))
    v = vector_dict.values()
    sidx = k.argsort()
    indx = sidx[np.searchsorted(k,a,sorter=sidx)]
    out = [v[i] for i in indx]
    return out

如果使用vector_dict.keys()获得的密钥已经排序,请跳过argsort()并使用sidx步骤编制索引。或者,我们可以进行简单的检查并获得修改后的版本,例如 -

def lookup_dict_app1_mod(vector_dict, a):
    k = np.array(list(vector_dict.keys()))
    v = np.array(list(vector_dict.values()))
    if (k[1:] >= k[:-1]).all():
        return v[np.searchsorted(k,a)].tolist()
    else:
        sidx = k.argsort()
        return v[sidx[np.searchsorted(k,a,sorter=sidx)]].tolist()

def lookup_dict_app2_mod(vector_dict, a):
    k = np.array(list(vector_dict.keys()))
    v = vector_dict.values()
    if (k[1:] >= k[:-1]).all():
        return [v[i] for i in np.searchsorted(k,a)]
    else:
        sidx = k.argsort()
        indx = sidx[np.searchsorted(k,a,sorter=sidx)]
        return [v[i] for i in indx]

示例运行 -

In [166]: vector_dict = {1: 'One', 2: 'Two', 3: 'Three', 0:'Zero'}

In [167]: a = np.array([1,2,3,2,3,1])

In [168]: lookup_dict_app1(vector_dict, a)
Out[168]: ['One', 'Two', 'Three', 'Two', 'Three', 'One']

In [169]: lookup_dict_app2(vector_dict, a)
Out[169]: ['One', 'Two', 'Three', 'Two', 'Three', 'One']

答案 2 :(得分:1)

我写了一个矢量化的python字典/集合,可以有效地存储数据并使用numpy数组。支持大多数numpy数据类型的组合。

您可以在这里找到项目和文档:https://github.com/atom-moyer/getpy