[英]numpy fill ndarray with values of a 1D array
我想用数组 b 沿维度 i 的值填充 Ndarray x ,而不使用 for 循环。 这段代码是我目前正在使用的,但速度不是那么快。 有没有更好的办法?
for i in range(len(b)):
x[...,i,:,:] = b[i]
编辑 1:这几乎是我正在寻找的,但对于更高的维度,它似乎不起作用。 x
的维度为 8,重要的是 Ndarray 的形状保持不变。 还有什么想法吗?
import numpy as np
x = np.ones((2,3,4))
b = np.arange(3)
for i in range(len(b)):
x[:,i,:] = b[i]
x
Out[5]:
array([[[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.]],
[[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.]]])
y = np.tile(b,(4,1,2)).T
y
Out[7]:
array([[[0, 0, 0, 0]],
[[1, 1, 1, 1]],
[[2, 2, 2, 2]],
[[0, 0, 0, 0]],
[[1, 1, 1, 1]],
[[2, 2, 2, 2]]])
编辑2:这似乎可以完成工作
z[...] = b.reshape(1,-1,1)
z
Out[20]:
array([[[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.]],
[[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.]]])
根据目标数组的形状,您可以执行以下操作
>>> import numpy as np
>>> x = np.ones((4,8))
>>> x
array([[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.]])
>>> b = np.arange(4)
>>> b
array([0, 1, 2, 3])
>>> x[:,1] = b
>>> x
array([[1., 0., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 2., 1., 1., 1., 1., 1., 1.],
[1., 3., 1., 1., 1., 1., 1., 1.]])
在此示例中,我们将b
分配给 2D 数组x
的第1
列
相反,如果您尝试重复b
一定次数,则可以使用np.tile
>>> x = np.tile(b, (8,1)).T
>>> x
array([[0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2, 2, 2],
[3, 3, 3, 3, 3, 3, 3, 3]])
有一种更快的方法。 您可以重塑 b 以添加新维度并获得 numpy 广播规则的优势:
x[...,:,:,:] = b.reshape(-1,1,1)
这里我假设b
是一个向量。
另一种创建新维度的等效方法如下代码所示:
x[...,:,:,:] = b[:, np.newaxis, np.newaxis]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.