numpy在2D数组中应用聚合信息

时间:2014-02-24 22:24:01

标签: python numpy multidimensional-array

我在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版本中工作的解决方案给出的奖励积分

评论:编辑:代码现在应该正常工作

1 个答案:

答案 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是一个很好的参考。