我有一个数组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
。
如何更改代码以完全随机获取三个最小值,而不是始终使用前三个?
答案 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))
如果您有非常大的数据,那么对整套进行排序可能成本太高;然后迭代地找到每个下一个最小值可能是更好的方法。 (如果这方面不明确且对你很重要,请询问更多细节。)