numpy.tile没有像Matlab repmat一样工作

Tin*_*pic 1 python matlab numpy equivalent

根据NumPy中MATLAB的repmat的等价物,我尝试使用python从3x3数组构建3x3x5数组.

在Matlab中,这项工作正如我所料.

a = [1,1,1;1,2,1;1,1,1];
a_= repmat(a,[1,1,5]);
Run Code Online (Sandbox Code Playgroud)

大小(a_)= 3 3 5

但对于numpy.tile

b = numpy.array([[1,1,1],[1,2,1],[1,1,1]])
b_ = numpy.tile(b, [1,1,5])
Run Code Online (Sandbox Code Playgroud)

b_.shape =(1,3,15)

如果我想生成与Matlab相同的数组,那么它的等价物是什么?

编辑1

我期望获得的输出是

b_(:,:,1) =

1 1 1  
1 2 1  
1 1 1  

b_(:,:,2) =

1 1 1  
1 2 1  
1 1 1  

b_(:,:,3) =

1 1 1  
1 2 1  
1 1 1  

b_(:,:,4) =  

1 1 1  
1 2 1  
1 1 1  
b_(:,:,5) =

1 1 1  
1 2 1  
1 1 1  
Run Code Online (Sandbox Code Playgroud)

但是@farenorth和赠品numpy.dstack是什么

[[[1 1 1 1 1]  
[1 1 1 1 1]  
[1 1 1 1 1]]  

[[1 1 1 1 1]  
[2 2 2 2 2]  
[1 1 1 1 1]]  

[[1 1 1 1 1]  
[1 1 1 1 1]  
[1 1 1 1 1]]]  
Run Code Online (Sandbox Code Playgroud)

far*_*rth 10

NumPy函数通常不是matlab函数的"插入式"替换.通常,"等效"函数的使用方式存在细微差别.这需要时间来适应,但我发现过渡非常值得.

在这种情况下,np.tile文档指出当您尝试将数组平铺到比定义的更高维度时会发生什么,

numpy.tile(A,reps)

通过重复A代表给出的次数来构造数组.

如果reps的长度为d,则结果的维度为max(d,A.ndim).

如果A.ndim <d,则通过预先添加新轴将A提升为d维.因此,形状(3)阵列被提升为(1,3)用于2-D复制,或形状(1,1,3)用于3-D复制.如果这不是所需的行为,请在调用此函数之前手动将A提升为d维.

在这种情况下,您的数组将被转换为形状[1, 3, 3],然后进行平铺.因此,为了获得您想要的行为,请确保将新的单例维度附加到您想要的数组中,

>>> b_ = numpy.tile(b[..., None], [1, 1, 5])
>>> print(b_.shape)
(3, 3, 5)
Run Code Online (Sandbox Code Playgroud)

请注意,我使用None(ie np.newaxis)和省略号表示法在数组末尾指定一个新维度.您可以在此处找到有关这些功能的更多信息.

受OP评论启发的另一个选择是:

b_ = np.dstack((b, ) * 5)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我使用元组乘法来"重新匹配"数组,然后由数组构造np.dstack.

正如@hpaulj指出的那样,Matlab和NumPy以不同的方式显示矩阵.要复制Matlab输出,您可以执行以下操作:

>>> for idx in xrange(b_.shape[2]):
...    print 'b_[:, :, {}] = \n{}\n'.format(idx, str(b_[:, :, idx]))
...
b_[:, :, 0] = 
[[1 1 1]
 [1 2 1]
 [1 1 1]]

b_[:, :, 1] = 
[[1 1 1]
 [1 2 1]
 [1 1 1]]

b_[:, :, 2] = 
[[1 1 1]
 [1 2 1]
 [1 1 1]]

b_[:, :, 3] = 
[[1 1 1]
 [1 2 1]
 [1 1 1]]

b_[:, :, 4] = 
[[1 1 1]
 [1 2 1]
 [1 1 1]]
Run Code Online (Sandbox Code Playgroud)

祝好运!