在某些情况下从numpy数组中删除特定值

时间:2018-11-28 08:39:11

标签: python arrays numpy

我有一个像这样的numpy数组:

answer = [1, 0, 1, 0, 2, 1, 0...,1, 1, 0,] # of size m

每个答案条目都是0到2之间的一个数字。

我还有另一个像这样的numpy数组:

remains_doors = [ [0,2], [0,1], [1,2], ... [1,2], [0,1],] # of size m

mains_doors的每个条目都是2个0到2之间的数字的列表,这些数字不能相同。

我需要使用以下条件从answer和stills_doors创建一个名为new_array的新数组: 对于每组,我必须保留不回答的相应数据,或者如果不存在该数据,则选择一个随机值。 例如:

answer        = [1, 0, 1, 2, 1 ,0]
remains_doors = [ [0,1], [1,2], [0,1], [2,0], [1,0], [0,1]]

new_array = [0, 2, 0, 0, 0, 1]

困难在于,为此,我不必使用任何循环(for,while)。 (供您参考,这是每月礼堂问题的一部分)

2 个答案:

答案 0 :(得分:0)

查找zip命令的文档,并在python中搜索有关列表推导的信息。

看着您的问题,您得到的第二个位置与[1,2]相比为0,则答案为2,所以:

new_array = [max(z for z in y if z != x) for x,y in zip(answer,remains_doors)]

如果要[1,2]而不是2,则删除max通话。

答案 1 :(得分:0)

如果不允许使用任何forwhile循环,也许可以进行递归?

answer        = [1, 0, 1, 2, 1 ,0]
remains_doors = [[0,1], [1,2], [0,1], [2,0], [1,0], [0,1]]
new_array = [0, 2, 0, 0, 0, 1]

import random

def do_the_job(answer, doors, idx = 0, new_array = []):
  end = len(answer)
  if idx < 0 or idx >= end:
    return
  a = answer[idx]
  d = doors[idx]
  if a in d:
    d.remove(a)
    new_array.append(d[0])
  else: new_array.append(random.sample(d, 1)[0])
  do_the_job(answer, doors, idx + 1, new_array)
  return new_array

print(do_the_job(answer, remains_doors))
#=> [0, 2, 0, 0, 0, 1] or sometimes [0, 1, 0, 0, 0, 1]