Numpy:平了一本字典

时间:2017-04-26 10:46:40

标签: python numpy dictionary

我正在努力寻找一些显然真的很容易...... 给出一个简单的字典,其中整数作为键,列表作为值

a = {}

a[0] = ['HI','HOME']
a[1] = ['tree','car', 'food']

print(a)    
{0: ['HI', 'HOME'], 1: ['tree', 'car', 'food']}

我想得到一个只有键的列表/ np.array:

[0,0,1,1,1]

我试图寻找地图功能,但我还没找到任何东西...... 感谢

2 个答案:

答案 0 :(得分:2)

使用np.repeatmap(len..) -

np.repeat(a.keys(), map(len,a.values()))

示例运行 -

In [152]: a
Out[152]: {0: ['HI', 'HOME'], 1: ['tree', 'car', 'food']}

In [153]: np.repeat(a.keys(), map(len,a.values()))
Out[153]: array([0, 0, 1, 1, 1])

或者,我们可以使用列表理解来获取长度。因此,map(len,a.values()可以替换为 -

[len(i) for i in a.values()]

对于Python 3.x,我相信,我们需要将listmap包裹起来 -

In [39]: np.repeat(list(a.keys()), [len(i) for i in a.values()])
Out[39]: array([0, 0, 1, 1, 1])

答案 1 :(得分:2)

我认为最优化的方式(特别是对于短小型和中型数组)使用嵌套列表理解,如下所示:

In [66]: [key for key, val in a.items() for _ in val]
Out[66]: [0, 0, 1, 1, 1]

以下是其他答案的基准(更快):

In [75]: %timeit np.repeat(list(a.keys()), list(map(len, a.values())))
100000 loops, best of 3: 5.18 us per loop

In [76]: %timeit [key for key, val in a.items() for _ in val]
1000000 loops, best of 3: 558 ns per loop

对于最大的数据集,您应该使用numpy,但在计算键和值的长度时会有一些变化:

a = {i:[3, 4, 5]*1000 for i in range(1000)}

In [86]: %timeit [key for key, val in a.items() for _ in val]
10 loops, best of 3: 54.7 ms per loop

In [87]: %timeit np.repeat(list(a.keys()), list(map(len, a.values())))
100 loops, best of 3: 9.18 ms per loop

In [88]: %timeit np.repeat(list(a), [len(i) for i in a.values()])
100 loops, best of 3: 9.12 ms per loop