Python 与np.meshgrid相比,多维状态动作空间平铺更有效?

Python 与np.meshgrid相比,多维状态动作空间平铺更有效?,python,arrays,numpy,mesh,openai-gym,Python,Arrays,Numpy,Mesh,Openai Gym,首先,这是为了实践和比较,我知道有比线性网格更有效的方法来平铺状态空间 为了运行一些强化学习算法,我想将我的状态和动作空间线性化。因此,我希望每个空间动作对都是数组形式。问题是,不同的(健身房)环境具有不同的状态和行动空间维度。因此,我不喜欢硬编码的变量或维度。 因此,我需要计算每个状态-动作对,只给出每个动作对的最小值和最大值 我基本上解决了简单的问题,但没有一个解决方案是“漂亮的” 首先让我们计算状态和动作空间。用linspace将区域从最小值平铺到最大值。我已经给出了一个随机测试环境的变量

首先,这是为了实践和比较,我知道有比线性网格更有效的方法来平铺状态空间

为了运行一些强化学习算法,我想将我的状态和动作空间线性化。因此,我希望每个空间动作对都是数组形式。问题是,不同的(健身房)环境具有不同的状态和行动空间维度。因此,我不喜欢硬编码的变量或维度。 因此,我需要计算每个状态-动作对,只给出每个动作对的最小值和最大值

我基本上解决了简单的问题,但没有一个解决方案是“漂亮的”

首先让我们计算状态和动作空间。用linspace将区域从最小值平铺到最大值。我已经给出了一个随机测试环境的变量

将numpy导入为np
NOF_动作空间瓷砖=20
NOF_状态_空间_瓷砖=10
action\u low=np.array([-2])
state_low=np.array([-1,-1,-8])
action\u space=np.vstack([*[x.flatte()表示x in(np.meshgrid(*(np.linspace(action\u low,action\u high,NOF\u action\u space\u TILES.T)))].T)
state_space=np.vstack([*[x.flatte()表示x in(np.meshgrid(*(np.linspace(state_low,state_high,NOF_state_space_TILES.T)))].T
它按预期工作,并为状态和动作提供所有可能的组合。有没有更直接的方法?我需要使用*[]两次,因为np.meshgrid返回多个矩阵并尝试展平向量

现在来看有趣的部分

最后,我希望拥有所有可能的状态-动作对。每一个国家,每一个行动。这是编码相当快的for循环,但是。。。numpy和for loops不是快速的朋友。 以下是我的解决方案,适用于1D动作空间:

s\u s,a\u s=np.meshgrid(状态空间、动作空间)
状态\动作\空间=np.concatenate((
s_s.重塑(-1,状态空间形状[1]),
a_s.重塑(状态空间.shape[1],动作空间.shape[1],-1[0].T),轴=1)
通过
state\u space.shape[1]
显示单个状态/动作的模糊


一个问题是,
np.meshgrid
为3个状态空间维度中的每一个都返回一个s,而像上面那样对其进行重塑是行不通的,因为我们需要将状态重塑为3xn,将动作重塑为1xn

这甚至比上面的代码更糟糕,但目前仍然有效。有人对如何正确、快速地使用网格或其他东西有什么建议吗


最后,对于第二步,它只是两个矩阵的每一行的组合。一定有更好的方法…

多亏了以上两个答案,这里是我的最终结果。 我仍然必须使用*()来分解用于meshgrid的linspace,但现在它看起来更具可读性。 以前,国家行动代码的一个大问题是我试图将其过度复杂化。它只是将阵列相互复制。因此,只要在操作空间中有不同的操作,就可以复制(在本例中是平铺)状态空间数组。这与
操作空间大小^(操作dims)
相同


感谢以上两个答案,这里是我的最终结果。 我仍然必须使用*()来分解用于meshgrid的linspace,但现在它看起来更具可读性。 以前,国家行动代码的一个大问题是我试图将其过度复杂化。它只是将阵列相互复制。因此,只要在操作空间中有不同的操作,就可以复制(在本例中是平铺)状态空间数组。这与
操作空间大小^(操作dims)
相同


np.meshgrid
返回数组的元组
np.mgrid
一个数组
itertools.product
生成元组列表。还可以使用
np.tile
np.repeat
构造组合。仅仅通过阅读您的代码和描述,很难想象您的结果。应该有你所需要的一切。注:问题涉及两个因素,但答案也涵盖了更多。谢谢你们两位。我使用
np.tile()
将状态空间和动作空间组合在一起。我昨晚想得太多了。我还使用了@PaulPanzer的链接。我想我只是不知道搜索的正确术语。
np.meshgrid
返回数组的元组
np.mgrid
一个数组
itertools.product
生成元组列表。还可以使用
np.tile
np.repeat
构造组合。仅仅通过阅读您的代码和描述,很难想象您的结果。应该有你所需要的一切。注:问题涉及两个因素,但答案也涵盖了更多。谢谢你们两位。我使用
np.tile()
将状态空间和动作空间组合在一起。我昨晚想得太多了。我还使用了@PaulPanzer的链接。我想我只是不知道搜索的正确术语。
    action_space = np.stack(np.meshgrid(*(np.linspace(env.action_space.low, env.action_space.high, ACTION_SPACE_SIZE)).T), -1).reshape(-1, env.action_space.shape[0])

    state_space = np.stack(np.meshgrid(*(np.linspace(env.observation_space.low, env.observation_space.high, STATE_SPACE_SIZE)).T), -1).reshape(-1, env.observation_space.shape[0])

    state_action_space = np.concatenate((
        np.tile(state_space, (action_space.shape[0])).reshape(-1, state_space.shape[1])
        np.tile(action_space, (state_space.shape[0], 1))
        ), axis=1)