如何从一个1d Numpy数组的所有排列组合中删除所有的圆台排列组合?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从一个1d Numpy数组的所有排列组合中删除所有的圆台排列组合?相关的知识,希望对你有一定的参考价值。
我有这个向量。[a,a,b,c,c] 这是一个在无穷大的范围内重复的模式 我想找到它的所有循环的唯一排列方式
[a,a,b,c,c] = [a,b,c,c,a] 。 不好 (向右移动1步)
[a,a,b,c,c] = [b,c,c,a,a] 不好 (向右移动两步)
[A、C、B、A、C] 好的[b、c、a、a、c] 好的
一个比喻是: 一张有5个座位的圆桌。定位两个男性,女性和一个孩子(无性别)在所有可能的独特方式。
是否有一个智能功能,这numpy,scipy等真的非常感谢帮助。
Br Erik
答案
如果我的理解是正确的,那么像这样的东西可以帮助你。
from itertools import permutations
vector = [1,-1,0,1,-1]
unique_permutations = set(permutations(vector))
already_reviewed = []
for p in list(unique_permutations):
if p not in already_reviewed:
circular_permutations = [p[i:] + p[:i] for i in range(len(p))]
already_reviewed.extend(circular_permutations)
unique_permutations.difference_update(circular_permutations[1:])
print(unique_permutations)
另一答案
import numpy as np
from itertools import permutations
a = [1,1,0,-1,-1]
perms = np.array(list(set(permutations(a))))
# create all possible cyclic permutations,
all_cyclic = np.array([np.roll(a, i) for i in range(perms.shape[1])])
def find_rows(remove_me, from_here):
b = remove_me
a = from_here
# expand axis for broadcasting
idx = a[:, np.newaxis, :] == b[np.newaxis ,: ,:]
print(idx.shape)
# in broadcasted array find identical arrays .all(-1)
# that are IN `from_here`
return idx.all(-1).any(-1)
x = find_rows(all_cyclic, perms)
# now we need to invert the result
not_x = np.logical_not(x)
# now we can use not_x to pick the non-cyclic things
# from perms
perms_without = perms[not_x]
# TEST
for _ in all_cyclic:
# to bool: numpy.array(old_matrix, dtype=bool)
# or old_matrix != 0
diff = (_ - perms) != 0
print('in perms', np.any(np.all(np.logical_not(diff), axis=-1)))
diff = _ - perms_without
print('in perms without', np.any(np.all(np.logical_not(diff), axis=-1)))
以上是关于如何从一个1d Numpy数组的所有排列组合中删除所有的圆台排列组合?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 NumPy 中将 HDF5 2D 数组转换为 1D?
Numpy quirk:将函数应用于两个 1D 数组的所有对,以获得一个 2D 数组