У меня есть большие данные, такие как:Python матрица сравнения
{'a_1':0b110000,
'a_2':0b001100,
'a_3':0b000011,
'b_1':0b100100,
'b_2':0b000001,
'c_1':0b100000,}
и так далее ... структура данных может быть реорганизовано и больше, чтобы показать, что я хочу достичь. Строки «a» никогда не будут перекрываться по их подстрокам. Что было бы лучшим способом, чтобы получить наилучшие комбинации из двух (ab, ac) или трех (abc) или более строк с точки зрения большинства совпадающих значений? Надежда, вопросы понятны как-то, трудно описать:/ Возможно, некоторые операции с матрицами numpy?
Дополнительная информация: Возможные комбинации двух элементов: ab, ac, bc. ab проверит строки a (a_1, a_2, a_3) на строки b (b_1, b_2) друг друга. a_1 & b_1 означает 0b110000 & 0b100100 и дал бы один результат. a_1 & b_2 означает 0b110000 & 0b000001 и не даст никакого результата. Это будет описание решения с помощью циклов, но оно очень медленное, особенно с комбинациями 8 или около того (не охваченными примерами данных).
может быть более четкой структуры данных:
{'a': [0b110000,
0b001100,
0b000011],
'b': [0b100100,
0b000001],
'c': [0b100000]}
Позвольте мне показать, как я делаю эти расчеты до сих пор. Структура данных является своего рода разные, как я попытался начать этот вопрос с «Я думал, что» лучше структура ...
data = {'a':[1,1,2,2,3,3],
'b':[4,5,5,5,4,5],
'c':[6,7,7,7,6,7]}
combine_count = 3
for config in combinations(['a','b','c'],combine_count):
ret = {}
for index,combined in enumerate(zip(*tuple(data.get(k) for k in config))):
ret.setdefault(combined, []).append(index)
for k,v in ret.items():
score = len(v)
if score >= 2:
print(k,score)
моя проблема состоит в том, что прежде всего процесс построения в сочетании с большим combine_count занимает много времени. данные, конечно, намного больше. Он имеет около 231 ключ со списками каждая длиной ~ 60000. Кроме того, потребление ОЗУ слишком велико.
используйте пример данных, чтобы точно показать, какого результата вы достигнете. (ab, ac) и (abc), по-видимому, появились из ниоткуда и напрямую не связаны с вашими большими данными. – paddyg
добавил дополнительную информацию. Надеюсь, это поможет. –
, то это приведет к появлению a1 & b1-> 16, a1 & b2-> 0, a2 & b1-> 4, a2 & b2-> 0, a3 & b1-> 0, a3 & b2-> 1, которые будут совпадать и совпадать? Для вашей тройной версии оценка будет, скажем, a1 & b1 | a1 & c1 | b1 & c1? – paddyg