2015-05-23 121 views
2

我有使用稀疏向量兩點字典:更有效的解決方案?字典稀疏矢量

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]) 
+0

你真的需要你的鑰匙是字符串?你有沒有已知數量的密鑰,或者你想處理合並/添加任何可能的密鑰? –

+1

在scikti-learn中查看[the stuff](http://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_extraction)。我沒有這方面的經驗,但我認爲它可以做你想做的事。 –

+0

它必須是字符串。我當然可以將字符串映射到數字上,但我認爲這不會加速任何事情。是的,稍後添加更多密鑰 – carence

回答

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 
+0

這正是我期待的!謝謝 – carence

1

@ sirfz的Pandas approach可以使用熊貓Series一個班輪:

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

或者,如果您的API需要dict小號

>>> 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稀疏矩陣行和sklearnVectorizer輸出(稀疏矢量/映射)