更高效的解决方案字典作为稀疏的矢量

时间:2015-05-23 10:05:02

标签: python performance numpy scipy sparse-matrix

我有两个字典用作稀疏向量:

dict1 = {'a': 1, 'b': 4}
dict2 = {'a': 2, 'c': 2}

我编写了自己的__add__函数来获得所需的结果:

dict1 = {'a': 3, 'b': 4, 'c': 2}

重要的是我知道每个对应值的字符串'a','b'和'c'。只是确保我添加正确的尺寸是不够的。我还将获得更多,以前未知的字符串,其中包含我刚刚添加到字典中的一些值。

现在我的问题是:那里有更高效的数据结构吗?我查看了Numpy的数组和Scipy的稀疏矩阵,但据我所知,他们在这里没有任何帮助,或者我只是没有看到解决方案?

我可以将键和值保存在单独的数组中,但我认为我不能只使用任何已有的函数来获得所需的结果。

dict1_keys   = np.array([a, b])
dict1_values = np.array([1, 4])
dict2_keys   = np.array([a, c])
dict2_values = np.array([2, 2])

# is there anything that will efficiently produce the following?
dict1_keys   = np.array([a, b, c])
dict1_values = np.array([3, 4, 2])

2 个答案:

答案 0 :(得分:2)

或许pandas正是您所寻找的:

d1 = pandas.DataFrame(numpy.array([1, 4]), index=['a', 'b'], dtype="int32")
d2 = pandas.DataFrame(numpy.array([2, 2]), index=['a', 'c'], dtype="int32")

d1.add(d2, fill_value=0)

结果:

   0
a  3
b  4
c  2

答案 1 :(得分:1)

@ sirfz' Pandas approach可能是使用pandas Series的单线:

>>> pd.Series(dict1).add(pd.Series(dict2), fill_value=0)
a    3.0
b    4.0
c    2.0

或者,如果您的API需要dict s

>>> dict(pd.Series(dict1).add(pd.Series(dict2), fill_value=0))
{'a': 3.0, 'b': 4.0, 'c': 2.0}

另外,这应该处理dict s或Series s甚至scipy稀疏矩阵行和sklearn Vectorizer输出的混合输入(稀疏矢量/映射)