缩放或,将numpy数组的每个条目Map到另一个值范围

ut6juiuv  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(120)

我试图将强化学习连续动作值range(-1.0,1.0)Map到真实的输出。
假设我有一个numpy action数组actions = np.array([-1., 0.2, -0.3, 0.5]),数组的值可以是actions.min = -1.actions.max = 1.
现在,我需要将每个条目Map到单独的范围,例如

  • 操作[0]Map到范围(-0.4,1.54)
  • action [1]Map到range(1.4,1.54)
  • 操作[2]Map到范围(-2.4,2.0)
  • 操作[3]Map到范围(-1.54,0.4)

Map动作mapped_actions = np.array([-0.4, 1.484, -0.86, -0.085])
我目前的解决方案如下:

import numpy as np

actions = np.array([-1., 0.2, -0.3, 0.5])
mapped_low_high = np.array([[-0.4, 1.54], [1.4, 1.54],[-2.4, 2.], [-1.54, 0.4]])

mapped_actions = np.zeros_like(actions)

for i in range(actions.shape[0]):
    mapped_actions[i] = np.interp(actions[i], (-1., 1.), mapped_low_high[i])

字符串

是否有更好的方法将actions数组Map到mapped_actions?
dxxyhpgq

dxxyhpgq1#

用numpy数组进行循环比较慢。编写一个可以同时对整个数组进行操作的矢量化函数会更快。因为我们知道给定数组总是在-1和1之间,并且我们有一个新范围的数组,代码是一个简单的函数,它可以从一个范围Map到另一个范围。[a, b]的值。“

import numpy as np

actions = np.array([-1., 0.2, -0.3, 0.5])
mapped_low_high = np.array([[-0.4, 1.54],
                            [1.4, 1.54],
                            [-2.4, 2.],
                            [-1.54, 0.4]])

def remap(arr, mappings):
    out = arr.copy()
    a, b = mappings.T

    # remap out to [0,1]
    # assumes arr is [-1,1]
    out += 1.
    out /= 2.

    # remap out to [a,b]
    out *= b - a
    out += a
    return out

remapped = remap(actions, mapped_low_high)  # array([-0.4  ,  1.484, -0.86 , -0.085])

字符串

o4hqfura

o4hqfura2#

直接使用np.interp函数Map整个actions数组,而不使用循环。

import numpy as np

actions = np.array([-1., 0.2, -0.3, 0.5])
mapped_low_high = np.array([[-0.4, 1.54], [1.4, 1.54], [-2.4, 2.], [-1.54, 0.4]])

# Use np.interp directly on the entire array
mapped_actions = np.interp(actions, (-1., 1.), mapped_low_high.T)

# Transpose the results to obtain the desired shape
mapped_actions = mapped_actions.T

print(mapped_actions)

字符串
通过在整个数组上使用np.interp,可以避免使用循环,并以更简洁的方法获得相同的结果。

相关问题