基于另一个数组的形状进行零填充数组

4
我有K个特征向量,它们共享维度n,但具有可变的维度m(n x m)。它们都存储在一个列表中。
to_be_padded = []

to_be_padded.append(np.reshape(np.arange(9),(3,3)))

array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

to_be_padded.append(np.reshape(np.arange(18),(3,6)))

array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17]])

to_be_padded.append(np.reshape(np.arange(15),(3,5)))

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

我希望能找到一种聪明的方法,对这些np.arrays的行进行零填充,使它们都具有相同的维度m。我尝试使用np.pad来解决它,但是我没有想出一个漂亮的解决方案。任何帮助或正确方向的提示将不胜感激!结果应该使数组看起来像这样:
array([[0, 1, 2, 0, 0, 0],
       [3, 4, 5, 0, 0, 0],
       [6, 7, 8, 0, 0, 0]])

array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17]])

array([[ 0,  1,  2,  3,  4, 0],
       [ 5,  6,  7,  8,  9, 0],
       [10, 11, 12, 13, 14, 0]])

1
你想将填充数组分开还是合并到一个较大的数组中? - hpaulj
被连接到一个更大的数组中,这只需要使用np.concatenate(padded_features)即可完成。所选择的答案非常有效。 - NicolaiF
2个回答

4

您可以使用np.pad对此进行处理,它还可以使用指定填充宽度的值元组((top, bottom), (left, right))来填充2-D数组。您可以定义如下:

def pad_to_length(x, m):
    return np.pad(x,((0, 0), (0, m - x.shape[1])), mode = 'constant')

用法

您可以从找到列数最多的ndarray开始。假设您有两个ab

a = np.array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

b = np.array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

m = max(i.shape[1] for i in [a,b])
# 5

然后使用此参数来填充 ndarrays

pad_to_length(a, m)
array([[0, 1, 2, 0, 0],
       [3, 4, 5, 0, 0],
       [6, 7, 8, 0, 0]])

1
padded_features = [pad_to_length(x, m) for x in features] 的运行非常完美! - NicolaiF
我在使用pad_to_length函数时遇到了ValueError: operands could not be broadcast together with remapped shapes [original->remapped]错误。您知道如何解决吗? - user760900

2

我相信这个问题没有非常高效的解决方案。我认为你需要使用for循环遍历列表,并单独处理每个数组:

for i in range(len(to_be_padded)):
    padded = np.zeros((n, maxM))
    padded[:,:to_be_padded[i].shape[1]] = to_be_padded[i]
    to_be_padded[i] = padded

其中maxM是您列表中矩阵中最长的m


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接