如何从一个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 数组中删除所有零元素?

如何在 NumPy 中将 HDF5 2D 数组转换为 1D?

Numpy quirk:将函数应用于两个 1D 数组的所有对,以获得一个 2D 数组

如何将 1d numpy 数组附加到 2d numpy 数组 python

当数组的数量和每个数组的长度未知时生成字符组合的所有排列

Numpy 用 1 列将 1d 重塑为 2d 数组