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