基于其他阵列形状的零垫阵列
Zero pad array based on other array's shape
我有 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]])
我认为对此没有非常有效的解决方案。我认为您需要使用 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
矩阵。
您可以为此使用 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
。假设您有两个,a
和 b
:
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]])
我有 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]])
我认为对此没有非常有效的解决方案。我认为您需要使用 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
矩阵。
您可以为此使用 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
。假设您有两个,a
和 b
:
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]])