首页 > 解决方案 > 如何创建一个随机条目的numpy数组,每个索引中排除一个元素?

问题描述

我有一个val可能值的数组(例如val = [0, 1, 2, 3, 4, 5])和一个选定值的数组A(可能很长的列表)(例如A = [2, 3, 1, 0, 2, 1, ... , 2, 3, 1, 0, 4]

现在我想创建一个B长度相同的数组,AA[i]不同于B[i]每个数组,并且随机选择其中的i条目。B如何使用 numpy 有效地做到这一点?

标签: pythonnumpyrandomnumpy-ndarray

解决方案


这有点浪费,因为它为每个项目创建了一个临时列表,A但在其他方面满足了您的要求:

from random import choice


val = [0, 1, 2, 3, 4, 5]
A = [2, 3, 1, 0, 2, 1, 2, 3, 1, 0, 4]

val = set(val)
B = [choice(list(val - {x})) for x in A]
print(B) # -> [4, 2, 3, 2, 5, 4, 1, 5, 5, 4, 1]

简而言之:

发生的情况是将val其转换为set从中删除当前项目的a 。A因此,从这个结果子集中随机选择一个项目并添加到B.


您还可以使用以下方法对其进行测试:

print(all(x!=y for x, y in zip(A, B)))

当然返回True


最后,请注意,上述方法仅适用于可散列项。因此,如果您可能遇到类似val = [[1, 2], [2, 3], ..]的问题,您会遇到问题。


推荐阅读