2017-04-21 135 views
3

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

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

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 
+3

只需使用预期形状与'np.full':'np.full((2,2,3),a)'? – Divakar

+0

“轴2上的元素是另一个阵列”。那应该是一个“(2,3)”形阵列吧?你所建议的'[1,2,3]'不是... –

+0

@TomdeGeus:不,这个例子中的意图是把一个数组变成'[2,2,3]',或者我称之为[ 2,2]数组,其中元素是一个'[3]'数组。 – EquipDev

回答

3

有多种方法可以实现这一点。 Divakar在评论中指出,其中一种是使用np.full((2,2,3), a)中的np.full。或者,您可以使用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)) 

这将产生一个视图,而不是复制这样会更快的大型阵列。 编辑这看起来是你的演示要求的结果。

+0

输出数组是按照要求的,但我认为语法不太明显,并且易于记忆,与来自jotasi和Divakar的答案相比较。 – EquipDev

+0

同意。在某种程度上!如果a的维数小于输出结果(broadcast_to实际上也是这样),则tile()会自动预置轴,因此我将整形线放入以显示如何控制该过程。你可以争辩说,广播到结果数组的形状更清晰。正如我所说的,broadcast_to的优点在于它使得只读视图非常快速。 – paddyg

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) 
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]]]) 
相关问题