Python中的矢量字典

2024-10-02 04:17:39 发布

您现在位置:Python中文网/ 问答频道 /正文

在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"]

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

编辑:

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

^{pr2}$

虽然布尔掩码在迭代小字典时非常有效,但是对于大型字典(数千个键值paris)来说,它非常耗时。在


Tags: 方法keynumpy字典np数组one矢量化
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进行索引。或者,我们可以做一个简单的检查,得到修改后的版本,比如-

^{pr2}$

样本运行-

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']

Pandas数据结构为1D(^{})、2D(^{})和3D(^{})数据实现此功能:

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。在

相关问题 更多 >

    热门问题