5

例如,如何创建一个形状为 numpy 的数组[2, 2, 3],其中轴 2 的元素是另一个数组[1, 2, 3]

所以我想做这样的无效代码:

a = np.arange(1, 4)
b = np.full((3, 3), a)

产生一个数组,如:

[[[ 1.  2.  3.]
  [ 1.  2.  3.]]
 [[ 1.  2.  3.]
  [ 1.  2.  3.]]]

当然可以使循环填充喜欢,但认为可能有一个捷径:

for y in range(b.shape[0]):
    for x in range(b.shape[1]):
        b[y, x, :] = a
4

4 回答 4

3

有多种方法可以实现这一目标。一种是使用np.fullin ,np.full((2,2,3), a)正如 Divakar 在评论中指出的那样。或者,您可以使用np.tile它,它允许您通过将输入数组重复给定次数来构造数组。要构建您的示例,您可以执行以下操作:

import numpy as np

np.tile(np.arange(1, 4), [2, 2, 1])
于 2017-04-21T08:30:25.517 回答
2

根据 Divakar 的评论,答案也可以是:

import numpy as np
np.full([2, 2, 3], np.arange(1, 4))

还有一种可能是:

import numpy as np
b = np.empty([2, 2, 3])
b[:] = np.arange(1, 4)
于 2017-04-21T08:34:35.877 回答
2

如果您的 numpy 版本 >= 1.10,您可以使用 broadcast_to

a = np.arange(1,4)
a.shape = (1,1,3)
b = np.broadcast_to(a,(2,2,3))

这会产生一个视图而不是复制,因此对于大型数组来说会更快。编辑这看起来是您在演示中要求的结果。

于 2017-04-21T08:33:53.020 回答
1

也使用np.concatenate或它的包装np.vstack

In [26]: a = np.arange(1,4)

In [27]: np.vstack([a[np.newaxis, :]]*4).reshape(2,2, 3)
Out[27]: 
array([[[1, 2, 3],
        [1, 2, 3]],

       [[1, 2, 3],
        [1, 2, 3]]])

In [28]: np.concatenate([a[np.newaxis, :]]*4, axis=0).reshape(2,2, 3)
Out[28]: 
array([[[1, 2, 3],
        [1, 2, 3]],

       [[1, 2, 3],
        [1, 2, 3]]])
于 2017-04-21T10:18:15.290 回答