基本上,我想做的是根据是否有其他条件(确定赢,输或平局的结果)创建一个numpy数组,并像这样更新数组:
示例:
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
答案 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)
这是使用map
和reduce
的一种方法:
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])