是否可以将 python 2D 数组填充到以给定索引为中心

问题描述 投票:0回答:1

我正在寻找一种方法来转换给定的二维数组;

宽度 = 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() 但没有成功

python dynamic padding numpy-ndarray dynamic-mapping
1个回答
0
投票

这是否实现了您想要做的事情?

使用我的代码,您必须定义中心以及最大高度和宽度。

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)
© www.soinside.com 2019 - 2024. All rights reserved.