Python 如何用另一个数组创建或填充numpy数组?

Python 如何用另一个数组创建或填充numpy数组?,python,arrays,numpy,vectorization,numpy-ndarray,Python,Arrays,Numpy,Vectorization,Numpy Ndarray,如何创建形状为[2,2,3]的numpy数组,其中轴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

如何创建形状为
[2,2,3]
的numpy数组,其中轴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

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

import numpy as np

np.tile(np.arange(1, 4), [2, 2, 1])

如果您的numpy版本>=1.10,则可以使用广播\u

a = np.arange(1,4)
a.shape = (1,1,3)
b = np.broadcast_to(a,(2,2,3))
这将生成一个视图,而不是复制,因此对于大型阵列将更快。
编辑这看起来是您在演示中要求的结果。

根据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)

也可以使用
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]]])

只需将预期形状与
np.full
np.full((2,2,3),a)
?“其中轴2处的元素是另一个数组”。这应该是一个
(2,3)
形状的数组,对吗?您建议的
[1,2,3]
不是…@TomdeGeus:不是,示例中的目的是制作一个数组形状的
[2,2,3]
,或者我称之为
[2,2]
数组,其中元素是
[3]
数组。@Divakar:谢谢,这样做了。
如果数组是object dtype,
完整的
可能会产生意外的结果。在那里,它的行为类似于
[[]]*4
。输出数组符合要求,但与jotasi和Divakar的回答相比,我认为语法不太明显,也不容易记住。在某种程度上!如果a的尺寸小于输出结果,tile()会自动对轴进行预处理(实际上广播也会这样做),因此我插入了重塑线,以显示如何控制该过程。您可以说,对结果数组的形状进行广播更清晰。正如我提到的,broadcast_to的优点是它提供只读视图,因此速度非常快。