2015-05-23 1 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

Посмотрите на [материал] (http://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_extraction) в scikti-learn. У меня нет опыта в этом, но я думаю, что он может делать то, что вы хотите. –

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

Plus, это должно обрабатывать смешанные входы dict с или Series s или даже scipy разреженные строки матрицы и sklearnVectorizer выход (разреженные векторы/Отображение)