如何用另一个数组创建或填充一个 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 数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何用数组(或任何其他支持加法以便它可以偏移的东西)干净地索引numpy数组[重复]