在NumPy中,MATLAB的repmat是什么?

我想使用NumPy: repmat([1; 1], [1 1 1])执行下面的MATLAB代码的等价物。 我将如何做到这一点?

这里是一个更好的(官方) NumPy的Matlab用户链接 – 恐怕mathesaurus是相当过时。

repmat(a, m, n)的numpy相当于tile(a, (m, n))

这与多维度的工作,并给予类似的结果matlab。 (Numpy给出了一个3d输出数组,就像你期望的那样 – matlab出于某种原因给出了2D输出 – 但内容是相同的)。

Matlab的:

 >> repmat([1;1],[1,1,1]) ans = 1 1 

python:

 In [46]: a = np.array([[1],[1]]) In [47]: np.tile(a, [1,1,1]) Out[47]: array([[[1], [1]]]) 

请注意,您需要使用MATLAB的repmat的一些原因由NumPy的广播机制来处理,它允许您使用类似形状的数组进行各种types的math运算。 所以,如果你有一个1600x1400x3的arrays代表一个3色的图像,你可以(元素)乘以[1.0 0.25 0.25]以减less每个像素的绿色和蓝色的数量。 请参阅上面的链接了解更多信息。

查看Matlab用户的NumPy 。

Matlab的:

 repmat(a, 2, 3) 

NumPy的:

 numpy.kron(numpy.ones((2,3)), a) 

知道tilerepeat

 x = numpy.arange(5) print numpy.tile(x, 2) print x.repeat(2) 

我是这样理解的。 很高兴被纠正,希望这有助于。

假设你有一个2×3元素的matrixM. 这显然有两个维度。


我可以看到Matlab和Python之间没有区别,而要求沿着matrix已经有的维度来操作inputmatrix。 因此这两个命令

 repmat(M,m,n) % matlab np.tile(M,(m,n)) # python 

对于等级2的matrix(二维)是非常等价的。


当你要求重复/平铺超过inputmatrix的维数时,事情就会变得反直觉。 回到等级2的matrixM并形成2×3,看看输出matrix的大小/形状会发生什么变化就足够了。 说操纵的顺序现在是1,1,2。

在Matlab中

 > size(repmat(M,1,1,2)) ans = 2 3 2 

它复制了inputmatrix的前两个维(行和列),并将其重复一次到新的第三维(复制两次,即)。 真正的重复matrix的命名repmat

在Python中

 >>> np.tile(M,(1,1,2)).shape (1, 2, 6) 

它已经应用了不同的程序,因为我猜测,序列(1,1,2)的读取方式与Matlab中的不同。 正在从右向左读取列,行和面外尺寸方向的副本数量。 生成的对象与Matlab有不同的形状。 人们不能断言repmattile是等效的指令。


为了让tilerepmat一样工作,在Python中必须确保inputmatrix具有与序列中元素一样多的维度。 例如,通过一些预处理和创build相关对象N来完成

 N = M[:,:,np.newaxis] 

那么,在input端有一个N.shape = (2,3,1)而不是M.shape = (2,3) ,在输出端

 >>> np.tile(N,(1,1,2)).shape (2, 3, 2) 

这是size(repmat(M,1,1,2))的答案size(repmat(M,1,1,2)) 。 我认为这是因为我们已经引导了Python将第三维添加到(2,3)的右边,而不是左边,这样Python就可以像Matlab中那样计算出序列(1,1,2)阅读的方式。

N的Python答案[:,:,0]中的元素将包含与元素(:,:,1)相同的值。


最后,当我使用Kronecker产品时,似乎无法findrepmat的等价物

 >>> np.kron(np.ones((1,1,2)),M).shape (1, 2, 6) 

除非我如上所述将M预处理成N。 所以我认为最常用的方法是使用np.newaxis的方法。


当我们考虑秩3(三维)的matrixL和在输出matrix中没有添加新维度的简单情况时,游戏变得棘手。 这两个看似等价的指令不会产生相同的结果

 repmat(L,p,q,r) % matlab np.tile(L,(p,q,r)) # python 

因为Matlab中的行,列,面外方向是(p,q,r),而在Python中是(q,r,p),这在rank-2数组中是不可见的。 在那里,人们必须小心,获得相同的结果与两种语言将需要更多的预处理。


我知道这个推理可能不是一般的,但是我可以把它解决这个问题。 希望这会引起其他研究人员的更大的考验。