我正在寻找一种方法来转换给定的二维数组;
宽度 = w1 且高度 = h1
到 where 的填充数组;
宽度= max_wdith 和高度= max_height
w1 和 h1 都应该大于 3,但小于 max_height 和 max_width。我发现了 np.pad()。
技巧是我需要能够从原始二维数组中选择一个索引,使其始终成为填充数组的中心
Original Array:
[-1 0 5]
[0 0 0]
[5 5 5]
Chosen center coordinates: (1, 1)
Padded Array:
[-1 -1 -1 -1 -1]
[-1 -1 0 5 -1]
[-1 0 0 0 -1]
[-1 5 5 5 -1]
[-1 -1 -1 -1 -1]
如果中心坐标:为 (0,0):
padded Array:
[-1 -1 -1 -1 -1]
[-1 -1 -1 -1 -1]
[-1 -1 -1 0 5]
[-1 -1 0 0 0]
[-1 -1 5 5 5]
以上是一般性问题,以下将是我的场景的具体情况:
我得到了一个一维数组,它定义了一个二维占用网格,我用它来训练强化学习代理。在动态状态空间上没有太多工作,所以我选择一个大的常量数组大小,500,并计划首先将其转换为 2D,然后填充动态映射,该映射从 w=100、h=80 开始,随着它的增长。
随着更多区域的发现,地图将会扩大。
KEY:-1:未探索,0:自由空间,5:墙壁。
我需要能够选择中心索引的原因是因为我希望地图从中心开始增长,如果我从填充地图的上一次迭代中移动内容,则地图的内容看起来是动态的,但情况并非如此只有地图的大小随着它的增长而变化。
最后的手段,我将单独将动态数组的每个元素放入一个新数组中,但我想这在我的计算中会很慢,每次都会发生这种计算。
请询问是否需要更多说明!
我尝试使用 np.pad() 但没有成功
这是否实现了您想要做的事情?
使用我的代码,您必须定义中心以及最大高度和宽度。
import numpy as np
def pad_array(original_array, center_coordinates, max_width, max_height):
w1, h1 = original_array.shape
cx, cy = center_coordinates
# calculate padding on each side first
pad_left = max(0, max_width // 2 - cx)
pad_right = max(0, max_width - pad_left - w1)
pad_top = max(0, max_height // 2 - cy)
pad_bottom = max(0, max_height - pad_top - h1)
# then pad the original array
padded_array = np.pad(original_array, ((pad_top, pad_bottom), (pad_left, pad_right)), mode='constant', constant_values=-1)
return padded_array
original_array = np.array([[-1, 0, 5], [0, 0, 0], [5, 5, 5]])
center_coordinates = (0, 0)
max_width = 5
max_height = 5
padded_array = pad_array(original_array, center_coordinates, max_width, max_height)
print(padded_array)
center_coordinates = (1, 1)
max_width = 5
max_height = 5
padded_array = pad_array(original_array, center_coordinates, max_width, max_height)
print(padded_array)
我的中心 0,0 和 1,1 的输出如下:
[[-1 -1 -1 -1 -1]
[-1 -1 -1 -1 -1]
[-1 -1 -1 0 5]
[-1 -1 0 0 0]
[-1 -1 5 5 5]]
[[-1 -1 -1 -1 -1]
[-1 -1 0 5 -1]
[-1 0 0 0 -1]
[-1 5 5 5 -1]
[-1 -1 -1 -1 -1]]
您始终可以将宽度和高度共享为大小等变量,就像这样
import numpy as np
def pad_array(original_array, center_coordinates, max_size):
w1, h1 = original_array.shape
cx, cy = center_coordinates
# calculate padding on each side first
pad_left = max(0, max_size // 2 - cx)
pad_right = max(0, max_size - pad_left - w1)
pad_top = max(0, max_size // 2 - cy)
pad_bottom = max(0, max_size - pad_top - h1)
# then pad the original array
padded_array = np.pad(original_array, ((pad_top, pad_bottom), (pad_left, pad_right)), mode='constant', constant_values=-1)
return padded_array
original_array = np.array([[-1, 0, 5], [0, 0, 0], [5, 5, 5]])
center_coordinates = (0, 0)
max_size = 5
padded_array = pad_array(original_array, center_coordinates, max_size)
print(padded_array)