我在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])
}
很明显,通过[:]建立索引不起作用。 我该如何实现?
答案 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