我有一个(正常的,无序的)字典,它保存着我的数据,我将一些数据提取到一个numpy数组中来做一些线性代数。一旦完成,我想将生成的有序numpy向量数据放回到包含所有数据的字典中。什么是最好的,最Pythonic的方式呢?
Joe Kington suggests in his answer to "Writing to numpy array from dictionary"两个解决方案包括:
以下是一些(可能有用的)细节:
我的数据是嵌套词典。外部用于组:{groupKey:groupDict}和组键从0开始并按组计算总数。 groupDict包含有关项目的信息:(itemKey:itemDict).itemDict具有实际数据的键,这些键通常从0开始,但可以跳过数字,因为并非所有“项目位置”都被填充.itemDict键包括“name”之类的内容, 'description','x','y',...
获取数据很简单,字典很棒: data [groupKey] [itemKey] ['x'] = 0.12
然后我将诸如x和y之类的数据放入一个numpy向量和数组中,如下所示:
xVector = numpy.empty( xLength )
vectorIndex = 0
for groupKey, groupDict in dataDict.items()
for itemKey, itemDict in groupDict.items()
xVector[vectorIndex] = itemDict['x']
vectorIndex += 1
然后我去做我的线性代数并计算一个我想要添加回dataDict的z向量。问题是dataDict是无序的,所以我没有办法获得正确的索引。
Ordered Dict方法允许我知道顺序,然后通过dataDict结构索引并将数据重新放入。
或者,我可以在上面的内部for循环内创建另一个字典,它存储了vectorIndex,groupKey和itemKey之间的关系:
sortingDict[vectorIndex]['groupKey'] = groupKey
sortingDict[vectorIndex]['itemKey'] = itemKey
稍后,当需要将数据放回去时,我可以循环遍历向量并添加数据:
vectorIndex = 0
for z in numpy.nditer(zVector):
dataDict[sortingDict[vectorIndex]['groupKey']][sortingDict[vectorIndex]['itemKey']]['z'] = z
这两种方法对我来说同样直截了当。我不确定将dataDict更改为有序字典是否会在我的代码中的其他地方产生任何其他影响,但可能不会。添加排序字典似乎也很容易,因为它将与numpy数组和向量同时创建。我自己就认为我会使用sortingDict方法。
这些方法中的一种比其他方法更好吗?有没有更好的方式我没想到?我的数据结构对我来说效果很好,但是如果有办法改变它以改进其他一切,我会对它开放。
答案 0 :(得分:0)
我最终选择了选项#2,并且效果很好。