繁体   English   中英

numpy 用一维数组的值填充 ndarray

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM