Как создать счетчик выигрыша / проигрыша, обновляя массив numpy - PullRequest
2 голосов
/ 28 марта 2019

По сути, я пытаюсь создать массив пустышек на основе условий if, которые определяют результат выигрыша, проигрыша или ничьей, и обновит массив следующим образом:

Пример:

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

Будет производить массив NumPy

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

Где lose = -1, win = +1 и tie = 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 ]

2 голосов
/ 28 марта 2019

Используйте 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))
0 голосов
/ 28 марта 2019

более короткая альтернатива:

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

Выход:

array([-1, -2, -2, -2, -1, -1])
0 голосов
/ 28 марта 2019

Хорошо, просто ради интереса, я хотел посмотреть, смогу ли я достичь этого только с помощью понимания списка (так что это может работать и с простым списком).Вот результат:

>> 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]

Это было весело, есть идеи, как это оптимизировать?

0 голосов
/ 28 марта 2019

Вот подход с использованием map и reduce:

resp = list(functools.reduce(lambda x, y: x + [x[-1] + y], 
            map(mapper, arr), 
            [0]))
resp.pop(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...