Python中的顺序随机选择

2024-05-19 08:59:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一个数组中随机选择,但是要求输出数组的元素将增加1(从零开始)。例如,如果我想得到5个介于0和5之间的数字,那么就可以了

np.random.choice(np.arange(6), 5)
array([5, 0, 5, 2, 5])

在这种情况下,我希望这是:

^{pr2}$

另一个例子,如果

np.random.choice(np.arange(6), 5)
array([1, 1, 1, 4, 2])

我正试图以这样一种方式“还原”这一切

array([0, 0, 0, 2, 1])

最后一个例子…选择15个0到5之间的数字

np.random.choice(np.arange(6), 15)
array([4, 5, 3, 0, 4, 5, 3, 0, 2, 5, 2, 3, 2, 4, 4])

我最终想去的地方

array([3, 4, 2, 0, 3, 4, 2, 0, 1, 4, 1, 2, 1, 3, 3])

Tags: 元素地方np方式情况数字random数组
3条回答

如果原始序列只包含唯一元素,那么像np.unique这样的基于排序的方法在O(n logn)上实际上有点浪费,因为有O(n)解决方案可用(假设n>;=k,其中k是要选择的集的大小):

>>> import numpy as np
>>>
to_choose_from = [1, 5, 7, 9, 10, 'hello', ()]
>>> n = 12
>>> 
>>> k = len(to_choose_from)
# make sure no duplicates - skip this if you happen to know
>>> assert len(set(to_choose_from)) == k
>>> 
>>> chc = np.random.randint(0, k, (n,))
>>> chc
array([4, 4, 1, 5, 3, 1, 5, 5, 6, 1, 6, 6])
>>> 
>>> occur = np.zeros((k,), int)
>>> occur[chc] = 1
>>> idx, = np.where(occur)
>>> occur[idx] = np.arange(idx.size)
>>> result = occur[chc]
>>> result
array([2, 2, 0, 3, 1, 0, 3, 3, 4, 0, 4, 4])

你可以从一个随机选择的数组开始

x = np.random.choice(np.arange(6), 5)

然后收集唯一值并对其进行排序

^{pr2}$

然后将原始值映射到v中的索引:

result = [v.index(y) for y in x]

您要做的是将原始数组x中的每个条目替换为x的唯一元素数组中的索引(按排序顺序)。例如,如果xnp.array([7, 6, 2, 7, 7, 2]),那么{}的唯一元素是[2, 6, 7],我们希望用它在唯一元素数组中的位置来替换每个数字:也就是说,将每个2替换为0,每个{}用{},每个{}替换为{}。在

^{}函数同时完成这两项工作:它为您查找(排序)的唯一元素数组,如果您传递return_inverse=Truenp.unique也会给您第二个返回值,该值正好包含您要查找的索引。因此,您只需使用return_inverse=True调用np.unique,丢弃第一个返回值,保留第二个返回值。示例:

>>> import numpy as np
>>> np.unique([5, 0, 5, 2, 5], return_inverse=True)[1]
array([2, 0, 2, 1, 2])
>>> x = np.array([4, 5, 3, 0, 4, 5, 3, 0, 2, 5, 2, 3, 2, 4, 4])
>>> np.unique(x, return_inverse=True)[1]
array([3, 4, 2, 0, 3, 4, 2, 0, 1, 4, 1, 2, 1, 3, 3])

相关问题 更多 >

    热门问题