【发布时间】:2016-01-11 14:29:39
【问题描述】:
我想有效地 找到具有绑定值的向量的排列。
例如,如果perm_vector = [0,0,1,2] 我想获得[0,0,1,2], [0,0,2,1], [0,1,2,0] 等的所有组合作为输出,但我不想获得[0,0,1,2] 两次,这是标准itertools.permutations(perm_vector) 会给出的。
我尝试了以下方法,但是当 perm_vector grows 在 len 中时,它的工作速度真的很慢:
vectors_list = []
for it in itertools.permutations(perm_vector):
vectors_list.append(list(it))
df_vectors_list = pd.DataFrame( vectors_list)
df_gb = df_vectors_list.groupby(list(df_vectors_list.columns))
vectors_list = pd.DataFrame(df_gb.groups.keys()).T
实际上,这个问题具有更一般的“加速”性质。主要时间花在创建长向量的排列上——即使没有重复性,创建 12 个唯一值的向量的排列也需要“无穷大”。是否有可能在不访问整个排列数据但处理一堆数据的情况下迭代地调用 itertools?
【问题讨论】:
-
这是来自上述评论引用的线程中的评论的外部link,可能会有所帮助。
-
在 itertools 模块中有一个配方,查看 unique_everseen 配方:docs.python.org/3/library/itertools.html#itertools-recipes
-
基于 C++ 的
std::next_permutation思想的东西可能是合适的;std::next_permutation以您想要的方式处理重复项。我建议至少自己实施一次作为学习经验,但也有existing implementations available。
标签: python performance pandas itertools