Python 如何生成numpy数组的3个随机非重叠索引列表?

Python 如何生成numpy数组的3个随机非重叠索引列表?,python,numpy,Python,Numpy,我有以下凹凸阵列: y= 我想生成3个y行的非重叠索引列表,如下所示: list_1 = 70% of rows list_2 = 15% of rows list_3 = 15% of rows 我知道如何生成单个列表,例如list\u 1: import numpy as np list_1 = [np.random.choice(np.where(y == i)[0], size=n_1, replace=False) for i in np.unique(y)] 其中n_1等于对应

我有以下凹凸阵列:

y=

我想生成3个
y
行的非重叠索引列表,如下所示:

list_1 = 70% of rows
list_2 = 15% of rows
list_3 = 15% of rows
我知道如何生成单个列表,例如
list\u 1

import numpy as np

list_1 = [np.random.choice(np.where(y == i)[0], size=n_1, replace=False) for i in np.unique(y)]
其中
n_1
等于对应于所有行的70%的行数。在上面的
y
示例中,共有14行。这意味着14行中的70%等于9(四舍五入为9)。因此
n_1
等于9


但是,我不知道如何生成其余的列表(
list\u 2
list\u 3
),这样它们就不会与
list\u 1
中的行索引重叠

l2 = list(set(y) - set(list1))
现在,您可以从l2运行相同的np.random.choice代码并选择next 15% 并将其保存在列表2中,然后执行

list3 = list(set(l2) - set(list2))

也许你可以创建三个索引数组。使用“设置差异”来形成下一个索引数组。只需将整个数组洗牌并将洗牌输出切片即可。@Paritossing:这确实是个好主意。你能告诉我怎么做吗?和@paritossingh:shuffle的文档中提到:“注意,即使对于小len(x),x的置换总数可以快速增长,超过大多数随机数生成器的周期。这意味着长序列的大多数置换永远不会生成。例如,长度为2080的序列是梅森扭曲器随机数生成器周期内可以容纳的最大序列。”如何获取
l3
?像这样
l3=y.symmetric\u difference(np.concatenate(list1,l2))
您可以从l2获取list2的symmetric\u difference,剩下的元素将是list 3I不理解。我没有
列表2
。我只有
list1
作为起点。如果我以与创建
list1
相同的方式创建
list2
,然后应用
symmetric\u difference
,那么我将在
list2
中获得较少的行数,这些行数将不对应于15%。很抱歉,在您的更新中使用
list2
。正如我所说,我只有
list1
作为起点。上述评论解释了原因。如果我使用你的方法(如果我理解正确),我不会得到75%/15%/15%。您能从
list1
开始填写完整的代码,并说明它是如何在我的数据上工作的吗?
list3 = list(set(l2) - set(list2))