Массивы можно сгруппировать, если все значения (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