我想知道是否有一种更有效的方法来平坦我的数据。请看下面的数据结构被平面化的例子:
{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[主要])
可以在集合阶段
的底部使用数组快速完成。