在Python中随机获取重复值数组的3个最小值

时间:2014-11-11 10:52:02

标签: python arrays

我有一个数组my_array我希望,由于特定的原因忽略它的值-5和-10(是的,在下面的示例中,那里不是{{1但是在其他数组中,我要管理是),并获取数组的三个最小值的索引,并将它们附加到标题为-10的新列表中。

这是我的代码。

lista_indices_candidatos

这会从数组my_array = [4, -5, 10, 4, 4, 4, 0, 4, 4] a = np.array(my_array) indices = a.argsort() indices = indices[a[indices] != -5] indices = indices[a[indices] != -10] lista_indices_candidatos = [] for i in indices[:3]: lista_indices_candidatos.append(i) print lista_indices_candidatos 获取3个最小值[6, 0, 3]的索引

问题是,如果有重复的值,这会得到前三个最小值(第一个[4, -5, 10, 4, 4, 4, 0, 4, 4](索引0),第二个4(索引3),忽略数组的其余4

如何更改代码以完全随机获取三个最小值,而不是始终使用前三个?

5 个答案:

答案 0 :(得分:1)

myArray = [4,-5,10,4,4,4,0,4,4]

myUniqueArray = list(set(myArray))

myUniqueArray.sort()

return [myArray.index(myUniqueArray [0]),myArray.index(myUniqueArray [1]),myArray.index(myUniqueArray [2])]

.index不会给你一个随机索引,因为它对于一组输入列表总是相同的值,但你可以使用那个部分。

答案 1 :(得分:1)

我没有引入随机性,因为它没有真正看到这样做的重点。

如果您需要前3个最低正值

sorted([x for x in my_array if x >= 0])[:3] 

如果您需要前三个最低正值及其初始索引

sorted([(x,idx) for idx,x in enumerate(my_array) if x >= 0], key=lambda t: t[0])[:3]

如果您只需要前3个最低正值初始索引

[i for x,i in sorted([(x,idx) for idx,x in enumerate(my_array) if x >= 0], key=lambda t: t[0])[:3]]

答案 2 :(得分:1)

我的想法是你要为my_array中的值获得3个随机索引,不包括[-10,-5],必须在剩余集合的3个最低值的索引列表中选择3个随机索引,对?

这个怎么样:

from random import sample
my_array = [4, -5, 10, 4, 4, 4, 0, 4, 4]
sample([i for i, x in enumerate(my_array) if x in sorted(set(my_array) - {-10, -5})[:3]], 3)

将有限的一组值分解出来,即:

from random import sample

my_array = [4, -5, 10, 4, 4, 4, 0, 4, 4]
filtered_list = sorted(set(my_array) - {-10, -5})[:3]

# Print 3 sample indices from my_array
print sample([i for i, x in enumerate(my_array) if x in filtered_list], 3)

答案 3 :(得分:1)

好的,我也不确定你想要达到的目的。我喜欢Nasha的简单回答,但我想你总是希望结果集中的索引为0。我理解你的方式,你想要最低三个值的索引,并且只有当其中一个值被列出多次时,你想从这些值中随机选择。

我在尝试解决方案:

import random

my_array = [4, -5, 10, 4, 4, 4, 0, 4, 4]
my_dict = {}
lista_indices_candidatos = []

for index, item in enumerate(my_array):
    try:
        my_dict[item] = my_dict[item] + [index]
    except:
        my_dict[item] = [index]

for i in [x for x in sorted(my_array) if x != -10 and x != -5][:3]:
    lista_indices_candidatos.append(random.choice(my_dict[i]))

print lista_indices_candidatos

在此解决方案中,我构建了一个字典,其中包含来自my_array的所有值作为键。字典的值是这些数字在my_array中具有的索引列表。然后我使用列表推导和切片来获得在for循环中迭代的三个最低值。在那里,我可以通过从my_dict中随机选择来随机选择给定值的索引。

我敢打赌,有更好的方法来实现你想要达到的目标。也许你可以让我们知道你想要做什么,这样我们就可以改进我们的答案。

在阅读你的评论后,我发现你实际上并不想要一个完全随机的选择,而是一个随机选择而不重复。所以这是一个更新版本。

import random

my_array = [4, -5, 10, 4, 4, 4, 0, 4, 4]
my_dict = {}
lista_indices_candidatos = []

for index, item in enumerate(my_array):
    try:
        my_dict[item] = my_dict[item] + [index]
    except:
        my_dict[item] = [index]

for l in my_dict:
    random.shuffle(my_dict[l])

for i in [x for x in sorted(my_array) if x != -10 and x != -5][:3]:
    lista_indices_candidatos.append(my_dict[i].pop())

print lista_indices_candidatos

答案 4 :(得分:0)

这个怎么样:

import random

def eachIndexSorted(a):  # ... without -5 and -10
  for value in sorted(set(a) - { -5, -10 }):
    indexes = [ i for i in range(len(a)) if a[i] == value ]
    random.shuffle(indexes)
    for i in indexes:
      yield i

def firstN(iterator, n):
  for i in range(n):
    yield iterator.next()

print list(firstN(eachIndexSorted(my_array), 3))

如果您有非常大的数据,那么对整套进行排序可能成本太高;然后迭代地找到每个下一个最小值可能是更好的方法。 (如果这方面不明确且对你很重要,请询问更多细节。)