基于另一种阵列形状的零填充阵列

Posted

技术标签:

【中文标题】基于另一种阵列形状的零填充阵列【英文标题】:Zero pad array based on other array's shape 【发布时间】:2019-07-02 14:42:13 【问题描述】:

我有 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.array 的行进行零填充,以使它们都共享相同的维度 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]])

【问题讨论】:

您想将填充数组分开,还是加入更大的数组? 加入了一个更大的数组,这只是由 np.concatenate(padded_features) 完成的。选择的答案就像一个魅力 【参考方案1】:

您可以为此使用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]])

【讨论】:

padded_features = [pad_to_length(x, m) for x in features] 完美运行! 为此我得到了一个ValueError: operands could not be broadcast together with remapped shapes [original->remapped](特别是pad_to_length函数)。你知道如何解决这个问题吗?【参考方案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

【讨论】:

以上是关于基于另一种阵列形状的零填充阵列的主要内容,如果未能解决你的问题,请参考以下文章

利用Python中的numpy.ndarray.reshape()对阵列形状进行调整

OpenGL像素阵列函数

基于时延法的麦克风阵列声源定位分析

填充2维VBA阵列Excel

水平堆栈2d Numpy阵列与3d Numpy阵列

如何将数据从一个阵列移动到另一个阵列?使用 UITableView