如何有效地将排序字典的字典扁平化为numpy.arrays



我想知道是否有一种更有效的方法来平坦我的数据。请看下面的数据结构被平面化的例子:

{t: SortedDict(
{0: {'t': 5, 'ids': [{'1': ['data']}]}, 
1: {'t': 2, 'ids': [{'1': ['data']}]}, 
2: {'t': 4, 'ids': [{'1': ['data']}]}, 
3: {'t': 1, 'ids': [{'1': ['data']}]}, 
4: {'t': 4, 'ids': [{'1': ['data']}]}, 
5: {'t': 1, 'ids': [{'1': ['data']}]}, 
6: {'t': 3, 'ids': [{'1': ['data']}]}, 
7: {'t': 2, 'ids': [{'1': ['data']}]}, 
8: {'t': 1, 'ids': [{'1': ['data']}]}, 
9: {'t': 1, 'ids': [{'1': ['data']}]}
}),t:SortedDict(
{
27: {'t': 1, 'ids': [{'5': ['data','data']}]}, 
28: {'t': 1, 'ids': [{'5': ['data','data','data','data']}]}, 
29: {'t': 2, 'ids': [{'5': ['data','data']}]}, 
30: {'t': 1, 'ids': [{'5': ['data']}]}, 
31: {'t': 2, 'ids': [{'5': ['data','data','data','data']}]}, 
32: {'t': 1, 'ids': [{'5': ['data']}]}
})}

注意:SortedDict来自Sorted Containers库,该库是Apache2许可的Python排序集合。

我已经评估了其他几个stackoverflow帖子,它们与列表理解或lambda函数做了类似的事情。最后,我编写了一个方法,将字典平展为三个列表;然而,我不确定这种方法是否是最佳方法。方法如下:

def flatten(self, d,calculation_dict):
l_key       = [] # Stores linearized keys
l_results   = [] # Stores linearized values after calculation
index       = [] # Stores the start of each individual sub-array
i = 0
for val in d.values():
index.append(i)
for key, t in val.t.items():
#Add calculation in here since I am Iterating over every element
l_results.append(t["t"] *  calculation_dict[key]) 
l_key.append(key)
i += 1
h_index = numpy.array(index, dtype=numpy.int32)
h_l_results = numpy.array(l_results,dtype=numpy.float)
l_key = numpy.array(l_key, dtype=numpy.int32)
index.append(i) 
return (l_key,l_results,index)

#Need output to be numpy.array
l_key       = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 27, 28, 29, 30, 31, 32]
l_results   = [5.0, 2.0, 4.0, 1.0, 4.0, 1.0, 3.0, 3.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1,0]
index       = [0, 10]

在我的应用程序中,速度是非常重要的。因此,任何反馈或建议都将非常感谢。

编辑:忘了说我需要一个numpy数组的最终结果。不知道这是否改变了什么。

编辑:感谢Glauco的建议,我修改了扁平化方法如下:

def flatten_numpy(self, d,calculation_dict):
l_results   = numpy.empty(self.size,dtype=numpy.float)
l_key       = numpy.empty(self.size, dtype=numpy.int32)
index       = []
i = 0
for val in d.values():
index.append(i)
for key, t in val.t.items():
l_results[i] = (tf["tf"] *  idf[term]) 
l_key[i] = term
i += 1
index.append(i) 
h_index = numpy.array(index, dtype=numpy.int32)
return (l_key,l_results,index)

事实证明,在算法的前面,我已经必须访问每个子字典的大小。利用这一点,我开始累积这个value size变量,在测试了新方法之后,它稍微快了一些。测试结果如下:

#Each Test was executed on the different data and ran 1000 times
Test#1 | Flatten        6.422301292419434   | Flatten_numpy     4.761376142501831
Test#2 | Flatten        5.212526082992554   | Flatten_numpy     4.901215553283691
Test#3 | Flatten        5.2060017585754395  | Flatten_numpy     5.266955852508545
Test#4 | Flatten        6.079436302185059   | Flatten_numpy     4.803238153457642
Test#5 | Flatten        5.059106349945068   | Flatten_numpy     4.565468788146973

你的方法在算法上是正确的它是0 (n+m)它是线性的,没有其他方法。如果您知道有多少字典将从集群到达,那么创建空的numpy数据结构并在运行时填充它会更方便,从而避免列表追加。

最后,tcompuatation:

l_results.append (t("t" * calculation_dict[主要])

可以在集合阶段

的底部使用数组快速完成。

最新更新