我希望在字典上有一个数组操作并返回相应的值。而不是循环通过它会很好地以pythonic方式做到这一点,例如
results[:] = dict[np_vec[:]]
虽然这不起作用,我希望也许有一种我不知道的方法?
在这种情况下,np_vec
具有与dict中的键对应的整数,而值是元组,我希望在results
中列出它们。
答案 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,只是不值得额外的工作。