从作用于字典的数组中获取numpy数组

时间:2016-01-17 00:44:04

标签: python numpy dictionary

我希望在字典上有一个数组操作并返回相应的值。而不是循环通过它会很好地以pythonic方式做到这一点,例如

results[:] = dict[np_vec[:]]

虽然这不起作用,我希望也许有一种我不知道的方法?

在这种情况下,np_vec具有与dict中的键对应的整数,而值是元组,我希望在results中列出它们。

1 个答案:

答案 0 :(得分:1)

最直接的Pythonic(即使用优秀的Python语法)方法是

results = [dict[value] for value in np_vec]

如果dict可能没有value,则需要进行优化。

Can I use a list comprehension on a list of dictionaries if a key is missing?

但也许你希望将某些东西作为矢量化numpy表达式传递。关键点在于字典一次只能访问一个密钥

另一种可能性是使用dict.keys()来获取密钥列表,并使用numpy方法将np_vec与此列表进行匹配。不能保证这会更快。

in1d doc

> in1d(a, b) is roughly equivalent to np.array([item in b for item in a]).

我正在想类似的事情(但细节可能已经关闭)

 keys = dict.keys()
 values = dict.values()    
 mask = np.in1d(dict.keys(), np_vec)
 result = values[mask]

使用数组工作代码:

带有数字键的字典,元组值:

In [302]: adict={k:v for k,v in zip([0,1,2,3,4,5],[(0,1),(1,2),(2,3),(3,4),(4,5)])}
In [303]: adict
Out[303]: {0: (0, 1), 1: (1, 2), 2: (2, 3), 3: (3, 4), 4: (4, 5)}

我们想要获取的键数组

In [304]: npvec=np.arange(4)

字典列表:

In [305]: keys=list(adict.keys())
In [308]: values=list(adict.values())
In [309]: values
Out[309]: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]

mask - 我们想要提取的密钥

In [310]: mask=np.in1d(keys,npvec)
In [311]: mask
Out[311]: array([ True,  True,  True,  True, False], dtype=bool)

要在一步中应用mask,我们必须使用数组; keys[mask]不起作用:

In [313]: np.array(keys)[mask]
Out[313]: array([0, 1, 2, 3])

如果values是简单数字,那么同样可行,但它们是元组。

In [314]: np.array(values)[mask]
Out[314]: 
array([[0, 1],
       [1, 2],
       [2, 3],
       [3, 4]])

我们可以将该2d数组转换回元组列表。

但是为了保留元组(或其他常规Python对象值),我们必须做一些更复杂的事情,例如。

In [315]: varray=np.empty(len(values),dtype=object)
In [317]: for i in range(5):varray[i]=values[i]
In [318]: varray
Out[318]: array([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)], dtype=object)

现在我们可以应用mask并获取正确的值集。

In [319]: varray[mask]
Out[319]: array([(0, 1), (1, 2), (2, 3), (3, 4)], dtype=object)

与简单列表理解解决方案形成对比:

In [321]: [adict[v] for v in npvec]
Out[321]: [(0, 1), (1, 2), (2, 3), (3, 4)]

有时候尝试更多的Pythonic,错误的numpy-onic,只是不值得额外的工作。