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

Posted

技术标签:

【中文标题】如何用另一个数组创建或填充一个 numpy 数组?【英文标题】:How to create or fill an numpy array with another array? 【发布时间】:2017-09-18 03:29:07 【问题描述】:

如何创建一个形状为[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 的预期形状即可:np.full((2,2,3), a)? "其中轴 2 的元素是另一个数组"。那应该是一个(2,3) 形状的数组吧?您建议的[1,2,3] 不是... @TomdeGeus:不,示例中的目的是创建一个形状为[2, 2, 3] 的数组,或者我称之为[2, 2] 数组,其中元素是[3] 数组。 @Divakar:谢谢,就这样。 full 如果数组是对象 dtype ***.com/q/43483663 可能会产生意外结果。它的行为类似于[[]]*4 【参考方案1】:

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

import numpy as np

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

输出数组符合要求,但与jotasi和Divakar的答案相比,我认为语法不太明显且易于记忆。 同意。在某种程度上!如果 a 的尺寸小于输出结果(broadcast_to 实际上也是如此),则 tile() 会自动预先添加轴,因此我将 reshape 线放入以显示如何控制该过程。您可能会争辩说,广播到结果数组的形状更清晰。正如我提到的 broadcast_to 的优点是它可以只读视图,所以非常快。【参考方案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)

【讨论】:

【参考方案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]]])

【讨论】:

以上是关于如何用另一个数组创建或填充一个 numpy 数组?的主要内容,如果未能解决你的问题,请参考以下文章

python如何用零填充numpy数组

如何用另一个蒙版数组的值填充蒙版2D数组?

2 如何用Python进行数据计算

如何用数组(或任何其他支持加法以便它可以偏移的东西)干净地索引numpy数组[重复]

如何用 LinearGradiant 或颜色数组填充 MPAndroidChart 中的 LineDataSet?

如何用本地目录中的 AVPlayerItem 类型的元素填充数组