Эффективно группируйте массивы одинакового размераPython

Программы на Python
Anonymous
Эффективно группируйте массивы одинакового размера

Сообщение Anonymous »

Я пытаюсь сгруппировать массивы одинакового размера.
Массивы можно сгруппировать, если все значения (30) внутри массива одинаковы, поэтому все значения должны быть одинаковыми.
Например: -1.345509 == -1.345509 и это для каждого из 30 значений в массиве.
Все значения в массиве имеют одинаковую точность.
В этом примере я извлекаю данные из фрейма данных и использую массивы для сравнения.
Сравнение первой и второй строк:

Код: Выделить всё

sum(np.array(df.iloc[0,:]) == np.array(df.iloc[1,:]) ) == 30
Если в наборе нет совпадения (пары), массив попадает в последнюю группу (совпадений нет).
Я написал код группировать массивы с помощью комбинаций:

Код: Выделить всё

# I have multiple datasets on which I want to apply the same algorithm.

# Sorted by 'Var1'

dfs = dict(tuple(all_data.groupby('Var1')))

dfs_used = dfs.copy()

dfs_not_used = dfs.copy()

dfs_used_pair = dfs.copy()

for k,v in dfs.items():

combi = np.arange(len(dfs[k]))

combi_all = list(combinations(list(combi),2))

diff = []

for i in combi_all:

plot_x = (i[0])

plot_y = (i[1])

f = np.array(dfs[k].iloc[plot_x,:]).astype(float)

s = np.array(dfs[k].iloc[plot_y,:]).astype(float)

g = f-s

euclidean_cal = math.sqrt(sum(g**2))

max_finger = max(abs(g))

diff.append([plot_x,plot_y, euclidean_cal,max_finger])

j = pd.DataFrame(diff)

j.columns = ['Plot1','Plot2','Euclidean Distance','Max difference per point']

dfs_copy[k] = j

check1 = dfs_copy[k][dfs_copy[k]['Euclidean Distance']==0]

check1_used = list(set(check1['Plot1'])) + list(set(check1['Plot2']))

last_check = list(set(np.arange(len(dfs[k]))) - set(check1_used))

#print the rows which cannot be paired to another test.

if len(last_check)>0:

dfs_not_used[k] = last_check

y_dict = dict(tuple(check1.groupby('Plot1')))

same_groups = y_dict.copy()

total_used = []

for d,s in y_dict.items():

used_now = set(np.array(y_dict[d]['Plot2'])) - set(total_used)

same_groups[d] = list(used_now)

total_used.extend(used_now)

dfs_used_pair[k] = same_groups
Это занимает очень много времени, поскольку проверяется каждая комбинация массивов.
Затем мой код группирует массивы по первому индексу комбинации, например:
Если (1,2) и (1,3) одинаковы, то: (1,2,3) — множество.
Код: очень просто, но требует времени.
Что я могу сделать, чтобы это улучшить? И, прежде всего, возможно, используйте всего несколько строк вместо 18 строк, которые у меня есть сейчас.

Подробнее здесь: https://stackoverflow.com/questions/785 ... fficiently

Вернуться в «Python»