重复列表以创建指定形状的numpy数组

2024-06-26 01:35:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个长度为10的值列表:

p = [1, 2, ..., 10]

此列表对应于4D数组的第二维度(称为T):

Tshp = np.shape(T)
print(Tshp)
(20, 10, 30, 40)

我需要创建一个与T大小相同的数组,在所有其他维度上重复列表p

我试过:

new_p = np.tile(p, [Tshp[0], Tshp[2], Tshp[3]])

但我得到了一些尺寸:

print(np.shape(new_p))
(20, 30, 400)

Tags: 列表new尺寸np数组printtileshape
2条回答

最简单的方法可能是使用np.full。这里的关键是使用广播来确保填写正确的维度:

result = np.full(T.shape, p.reshape(1, -1, 1, 1))

您可以通过类似的操作使用tile获得类似的结果:

s = list(T.shape)
s[1] = 1
result = np.tile(p.reshape(1, -1, 1, 1), s)

作业也有效:

result = np.empty_like(T)
T[:] = p.reshape(1, -1, 1, 1)

您甚至可以使用直接广播:

result = np.broadcast_to(p.reshape(1, -1, 1, 1), T.shape)

这是一个根本不复制数据的版本

在所有情况下,我都假设您将p转换为数组,例如使用p = np.array(p)。如果不是,用np.reshape(p, (...))替换p.reshape(...)。也可以省略前导单位尺寸标注,因为广播将向右对齐。例如,在所有情况下1, -1, 1,1都可以替换为-1, 1, 1

In [42]: p = np.arange(1,11)
In [43]: p.shape
Out[43]: (10,)
In [44]: T = np.zeros((20,10,30,40),int)

如果我们将p扩展为(10,1,1)形状,则通过广播可以将其分配给T,扩展为(1,10,1,1),然后再扩展到T.shape

In [45]: T[:] = p[:,None,None]

要使用tile,首先将p扩展到4d

In [48]: T2 = np.tile(p[None,:,None,None],(20,1,30,40))
In [49]: T2.shape
Out[49]: (20, 10, 30, 40)
In [50]: np.allclose(T,T2)
Out[50]: True

相关问题 更多 >