gpt4 book ai didi

python - 在numpy中随机选择不同的集合?

转载 作者:行者123 更新时间:2023-12-04 08:11:14 25 4
gpt4 key购买 nike

我试图在 numpy 中随机选择一组整数,但遇到了一个奇怪的错误。如果我用两组不同大小定义一个 numpy 数组,np.random.choice毫无问题地在它们之间进行选择:

Set1 = np.array([[1, 2, 3], [2, 4]])
In: np.random.choice(Set1)
Out: [4, 5]
但是,一旦 numpy 数组的大小相同,就会出现值错误:
Set2 = np.array([[1, 3, 5], [2, 4, 6]])
In: np.random.choice(Set2)
ValueError: a must be 1-dimensional
可能是用户错误,但我检查了几次,唯一的区别是集合的大小。我意识到我可以做类似的事情:
Chosen = np.random.choice(N, k)
Selection = Set[Chosen]
在哪里 N是集合的数量, k是样本的数量,但我只是想知道是否有更好的方法,特别是当集合大小相同时我做错了什么来引发值错误。 Set1 的打印输出和 Set2以供引用:
In: Set1
Out: array([list([1, 3, 5]), list([2, 4])], dtype=object)
In: type(Set1)
Out: numpy.ndarray

In: Set2
Out:
array([[1, 3, 5],
[2, 4, 6]])
In: type(Set2)
Out: numpy.ndarray

最佳答案

您的问题是由于误解了 numpy 数组的工作原理。第一个示例不能“真正”转换为数组,因为 numpy 不支持不规则数组。您最终会得到一个指向两个 python 列表的对象引用数组。第二个例子是一个适当的 2xN 数值数组。我可以在这里想到两种类型的解决方案。
显而易见的方法(顺便说一句,这两种情况都适用)是选择索引而不是子列表。由于您使用替换进行采样,因此您可以生成索引并直接使用它:

Set[np.random.randint(N, size=k)]
这与
Set[np.random.choice(N, k)]
如果你想选择不替换,你最好的选择是使用 np.random.choice , 与 replace=False .这类似于洗牌,但效率低于洗牌。在任何一种情况下,您都可以为索引编写一个单行代码:
Set[np.random.choice(N, k, replace=False)]
或者:
index = np.arange(Set.shape[0])
np.random.shuffle(index)
Set[index[:k]]
np.random.shuffle 的好处,但是,您可以将其应用于 Set直接,不管是一维数组还是多维数组。洗牌总是沿着第一个轴发生,所以你可以只取顶部 k之后的元素:
np.random.shuffle(Set)
Set[:k]
洗牌操作只能在原地工作,所以你必须把它写出来。对于大型数组,它的效率也较低,因为您必须预先创建整个范围,无论多小 k是。
另一种解决方案是将第二个示例转换为与第一个示例类似的列表对象数组。我不推荐此解决方案,除非您使用 numpy 的唯一原因是 choice功能。事实上我根本不推荐它,因为你可以而且可能应该使用 python 标准 random 此时模块。除了免责声明,您可以将第二个数组的数据类型强制为 object .它将消除使用 numpy 的任何好处,并且不能直接完成。简单设置 dtype=object仍将创建一个二维数组,但将存储对 python int 的引用对象而不是其中的基元。你必须做这样的事情:
Set = np.zeros(N, dtype=object)
Set[:] = [[1, 2, 3], [2, 4]]
您现在将获得一个与第一个示例中的对象基本等效的对象,因此可以应用 np.random.choice直接地。
备注
我显示遗产 np.random 方法这里是因为个人惰性如果没有别的。正如我链接到的文档中所建议的,正确的方法是使用新的 Generator API。对于 choice 尤其如此。方法,这在新的实现中效率更高。使用不再困难:
Set[np.random.default_rng().choice(N, k, replace=False)]
还有其他优点,例如您现在可以直接选择,甚至可以从多维数组中选择:
np.random.default_rng().choice(Set2, k, replace=False)
shuffle 也是如此。 , 其中, 如 choice ,现在允许您选择要重新排列的轴:
np.random.default_rng().shuffle(Set)
Set[:k]

关于python - 在numpy中随机选择不同的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65950088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com