如何创建赢/输计数器更新numpy数组

时间:2019-03-27 21:42:46

标签: python numpy

基本上,我想做的是根据是否有其他条件(确定赢,输或平局的结果)创建一个numpy数组,并像这样更新数组:

示例:

array(['lose','lose','tie','tie','win','tie'])

会产生numpy数组:

[-1,-2,-2,-2,-1,-1] 

lose = -1win = +1tie = 0的位置(不执行任何操作)

我已经尝试了诸如np.count_nonzero(conditions)之类的一些事情,但是还不太清楚。有人可以帮忙吗?

def game_session(num_games=100):
values = rand.randint(1,7, 2*num_games)
rolls_array = values.reshape((num_games,2))
for i in rolls_array:
    sum2 = i[0]+i[1] 

    if np.count_nonzero(sum2 ==2 or sum2==3 or sum2==12): #lose


    elif  np.count_nonzero(sum2 ==7 or sum2==11): #win


    elif np.count_nonzero(sum2 == 1 or sum2 == 4 or sum2 == 5 or sum2 == 6 or sum2 == 8 or sum2 == 9 or sum2 == 10): #do nothing

4 个答案:

答案 0 :(得分:2)

使用np.where和cumsum。 np.where(cond [,x,y])根据条件从x和y返回元素。由于要映射三个字符串,因此此代码使用嵌套np.where

result = np.cumsum(np.where(a == 'lose', -1, np.where(a == 'win', 1, 0)))

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

您还可以使用np.vectorize,

d = {'win':1, 'lose':-1, 'tie':0}
np.cumsum(np.vectorize(d.get)(a))

答案 1 :(得分:0)

这是使用mapreduce的一种方法:

resp = list(functools.reduce(lambda x, y: x + [x[-1] + y], 
            map(mapper, arr), 
            [0]))
resp.pop(0)

答案 2 :(得分:0)

好吧,只是为了好玩,我想看看我是否只能通过列表理解来实现(这样也可以在一个简单的列表上工作)。看结果:

>> x = ["win","lose","win","win","tie","tie","lose"]
>> results = [[sum([1 if it=="win" else 0 if it=="tie" else -1 for i,it in enumerate(x)][:y])
      if y > 0 else 0][0] + [1 if it=="win" else 0 if it=="tie" else -1][0] for y,it in enumerate(x)]
>> results
output : [1, 0, 1, 2, 2, 2, 1]

这很有趣,关于如何优化它的任何想法?

答案 3 :(得分:0)

更短的选择:

np.cumsum(1*(x=='win')-(x=='lose'))

输出:

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