我在2D数组中有一个代理的“健康”列表:
health=[[0.5,0.8],[0.1,0.5],[0.5,0.7]]
和一组操作(每个代理一个):
actions=[[0,1],[2,0],[1,1]]
(可能的行动= {0,1,2}
根据他们的行为,根据支付矩阵,他们的健康状况会增加:payoff[agent_row][action]=
[[0,0.2,0.5],
[0,1,0.6],
[0,0.2,0.4]]
通过以下方式计算他们的新健康状况:
health=[[0.5,0.8],[0.1,0.5],[0.5,0.7]]
actions=[[0,1],[2,0],[1,1]]
payoff= \
[[0,0.2,0.5], \
[0,1,0.6], \
[0,0.2,0.4]]
for r,h in enumerate(health):
for i,_ in enumerate(h):
health[r][i]+=payoff[r][actions[r][i]]
print health
我如何使用numpy来加快速度?
对于在相当稳定的pypy版本中工作的解决方案给出的奖励积分
评论:编辑:代码现在应该正常工作
答案 0 :(得分:0)
使用numpy可以直接使用整数数组来索引其他数组。例如,A[[0, 1, 2], [11, 12, 13]]
将返回一个包含3个A[0, 11], A[1, 12] and A[2, 13]
元素的数组。以下是如何将此概念应用于您的问题。
import numpy as np
health = np.array([[0.5, 0.8], [0.1, 0.5], [0.5, 0.7]])
actions = np.array([[0, 1], [2, 0], [1, 1]])
payoff = np.array([[0, 0.2, 0.5],
[0, 1, 0.6],
[0, 0.2, 0.4]])
r, c = np.indices(health.shape)
health += payoff[r, actions]
这称为高级索引,here是一个很好的参考。