2024-06-26 01:35:53 发布
网友
我有一个长度为10的值列表:
p = [1, 2, ..., 10]
此列表对应于4D数组的第二维度(称为T):
T
Tshp = np.shape(T) print(Tshp) (20, 10, 30, 40)
我需要创建一个与T大小相同的数组,在所有其他维度上重复列表p
p
我试过:
new_p = np.tile(p, [Tshp[0], Tshp[2], Tshp[3]])
但我得到了一些尺寸:
print(np.shape(new_p)) (20, 30, 400)
最简单的方法可能是使用np.full。这里的关键是使用广播来确保填写正确的维度:
np.full
result = np.full(T.shape, p.reshape(1, -1, 1, 1))
您可以通过类似的操作使用tile获得类似的结果:
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
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:
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
最简单的方法可能是使用
np.full
。这里的关键是使用广播来确保填写正确的维度:您可以通过类似的操作使用
tile
获得类似的结果:作业也有效:
您甚至可以使用直接广播:
这是一个根本不复制数据的版本
在所有情况下,我都假设您将
p
转换为数组,例如使用p = np.array(p)
。如果不是,用np.reshape(p, (...))
替换p.reshape(...)
。也可以省略前导单位尺寸标注,因为广播将向右对齐。例如,在所有情况下1, -1, 1,1
都可以替换为-1, 1, 1
如果我们将
p
扩展为(10,1,1)形状,则通过广播可以将其分配给T
,扩展为(1,10,1,1),然后再扩展到T.shape
:要使用
tile
,首先将p
扩展到4d相关问题 更多 >
编程相关推荐