numpy 对二维数组的行应用条件

guykilcj  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(182)

考虑a = np.array([0, 0, 1, 1, 2, 2, 3, 3])
在多重集a中,0、1、2和3各有2个示例。
当我们从左到右遍历每一行时,我想找到满足条件的a的所有排列:

**条件:**0、1、2和3的第一个示例必须按此顺序出现,但它们不必连续。

[0, 1, , 2, , 3, , ]正常,[0, 1, , 3, , 2, , ]不正常
每个数字的第二个示例可以出现在行中的任何位置,只要它在第一个示例之后(右侧)。
[0, 1, 0, 2, 2, 3, 1, 3]可以
我首先找到多重集a的所有8!/2**4 = 2525个排列:

from sympy.utilities.iterables import multiset_permutations
import numpy as np

a = np.array([0, 0, 1, 1, 2, 2, 3, 3])

resultList = []
for p in multiset_permutations(a):
    resultList.append(p)
    
out = np.array(resultList)

我的困难在于,当我试图设置条件时,我会淹没在细节中。更复杂的是,实际的数组a可能有多达5对值。**问题:**如何编写条件,以便从数组out中消除所有不满足条件的排列行?

nlejzf6q

nlejzf6q1#

由于您知道数组恰好由np.arange(4)中的元素对组成,因此可以使用np.argmax检查:

max_values = np.max(a)
uniques = np.arange(max_values + 1)
# or you can just do
# uniques = np.unique(a)

resultList = []
for p in multiset_permutations(a):
    idx = np.argmax(p==uniques[:,None], axis=1)
    if (idx[:-1] < idx[1:]).all():
        resultList.append(p)

resultList将包含4对的420置换;而4725对应于5对。

相关问题