同时访问字典中的所有键

时间:2019-03-26 16:46:32

标签: python dictionary

我在python中有一个字典,像这样:

mydict={
    "key1": np.array([1, 2, 3]),
    "key2": np.array([4, 5, 6]),
    "key3": np.array([7, 8, 9])
    }

现在,我想获取字典,但每个值数组中的第n个条目只有第一个。类似于mydict2=mydict[:][1]。预期的输出将是:

mydict2={
    "key1": 2
    "key2": 5
    "key3": 8
    }

我想同时获取所有数组的一部分。例如mydict3=mydict[:][:2]。我希望在这里:

mydict3={
    "key1": np.array([1, 2]),
    "key2": np.array([4, 5]),
    "key3": np.array([7, 8])
    }

很明显,通过[:]建立索引不起作用。 我该如何实现?

1 个答案:

答案 0 :(得分:3)

您所描述的是numpy主要提供的一项功能,切片可为您提供视图。字典是不同的野兽,部分是因为字典无序

您必须对dict理解进行迭代:

mydict3 = {k: v[:2] for k, v in mydict.items()}

fullarray = np.arange(1, 10).reshape(3, 3)

我不会简单地将numpy数组存储在字典中,而是使用更大的数组:

>>> import numpy as np
>>> fullarray = np.arange(1, 10).reshape(3, 3)
>>> mydict1 = {'key1': fullarray[0, :], 'key2': fullarray[1, :], 'key3': fullarray[2, :]}
>>> mydict1
{'key1': array([1, 2, 3]), 'key2': array([4, 5, 6]), 'key3': array([7, 8, 9])}
>>> fullarray[:, 1]
array([2, 5, 8])
>>> fullarray[:, 1] *= 2
>>> fullarray[:, 1]
array([ 4, 10, 16])
>>> mydict1
{'key1': array([1, 4, 3]), 'key2': array([ 4, 10,  6]), 'key3': array([ 7, 16,  9])}

,并且最多使用字典将键映射到该数组上的切片。这些切片为您提供了视图,因此更改整个数组将反映在字典中的引用中:

fullarray[:, 0]

但是通过完整的numpy数组访问列更简单,因此fullarray[:, :2]>>> import numpy.lib.recfunctions as rfn >>> structured = rfn.unstructured_to_structured(np.arange(1, 10).reshape((3, 3)).T, names=('key1', 'key2', 'key3'))

另一种选择是使用structured arrays生成具有以下名称的行:

>>> structured['key1']
array([1, 2, 3]

这时使用键名进行索引会为您提供数组:

>>> structured[0]
(1, 4, 7)
>>> structured[:2]
array([(1, 4, 7), (2, 5, 8)],
      dtype=[('key1', '<i8'), ('key2', '<i8'), ('key3', '<i8')])
>>> structured[:2]['key1']
array([1, 2])
>>> structured[:2]['key2']
array([4, 5])
>>> structured[:2]['key3']
array([7, 8])

但是您也可以按“列”编制索引,包括切片:

import numpy as np
import numpy.lib.recfunctions as rfn

def dict_to_structured(d):
    return rfn.unstructured_to_structured(
        np.stack(list(mydict.values()), axis=1),
        names=list(mydict)
    )

转换现有字典将需要堆叠值:

aggregate