什么是NumPy中MATLAB的repmat的等价物

时间:2009-11-12 12:20:32

标签: python matlab numpy

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

7 个答案:

答案 0 :(得分:91)

这是一个更好的(官方的)NumPy for Matlab Users链接 - 我担心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]]])

答案 1 :(得分:17)

请注意,您需要使用MATLAB的repmat的一些原因由NumPy的broadcasting机制处理,它允许您使用类似形状的数组进行各种类型的数学运算。因此,如果你有一个代表三色图像的1600x1400x3数组,你可以(元素方向)将它乘以[1.0 0.25 0.25],以减少每个像素的绿色和蓝色数量。有关详细信息,请参阅上面的链接。

答案 2 :(得分:9)

请参阅NumPy for Matlab users

Matlab的:

repmat(a, 2, 3)

numpy的:

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

答案 3 :(得分:5)

了解tilerepeat

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

答案 4 :(得分:4)

这就是我从一些摆弄中理解它的方式。很高兴得到纠正,希望这会有所帮助。

假设您有2x3元素的矩阵 M 。这显然有两个方面。

我可以看到Matlab和Python之间没有区别,同时要求沿矩阵已有的维度操纵输入矩阵。 因此这两个命令

repmat(M,m,n) % matlab

np.tile(M,(m,n)) # python

对于等级2(二维)的矩阵来说实际上是等价的。

当您要求重复/平铺比输入矩阵更多的维度时,事情会违反直觉。回到第二级矩阵M和形状2x3,看看输出矩阵的大小/形状会发生什么就足够了。假设操纵的顺序现在是1,1,2。

在Matlab中

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

    2   3   2

它复制了输入矩阵的前两个维度(行和列),并重复了一次到新的第三维度(复制两次,即)。对于重复矩阵,命名repmat为真。

在Python中

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

它应用了不同的程序,因为我认为,序列(1,1,2)的读取方式与Matlab不同。从右到左读取列,行和面外维度方向的副本数。生成的对象与Matlab具有不同的形状。人们不能断言repmattile是等效的指令。

为了让tile表现得像repmat,在Python中,必须确保输入矩阵的维度与序列中的元素一样多。例如,通过一些预处理并创建相关对象 N

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

然后,在输入端,一个人有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))的答案。我认为这是因为我们已经引导Python将第三维添加到(2,3)的右边而不是左边,这样Python就可以像在Matlab中那样计算出序列(1,1,2)。读它的方式。

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

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

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

除非我如上所述将 M 预先置于 N 之前。所以我认为最常用的方法是使用np.newaxis的方式。

当我们考虑等级3(三维)的矩阵 L 并且在输出矩阵中没有添加新维度的简单情况时,游戏变得更加棘手。这两个看似等效的指令不会产生相同的结果

repmat(L,p,q,r) % matlab

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

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

我知道这种推理可能不是一般的,但我可以解决这个问题。希望这会邀请其他人进行更难的测试。

答案 5 :(得分:0)

import numpy as np

np.repeat(['a','b'], [2,5])
>>> array(['a', 'a', 'b', 'b', 'b', 'b', 'b'], dtype='<U1')

np.repeat([1,2], [2,5])
>>> array([1, 1, 2, 2, 2, 2, 2])

np.repeat(np.array([1,2]), [3]).reshape(2,3)
>>> array([[1, 1, 1],
           [2, 2, 2]])

np.repeat(np.array([1,2]), [2,4]).reshape(3,2)
>>> array([[1, 1],
           [2, 2],
           [2, 2]])

np.repeat(np.matrix('1 2; 3 4'), [2]).reshape(4,2)
>>> matrix([[1, 1],
            [2, 2],
            [3, 3],
            [4, 4]])

答案 6 :(得分:0)

numpy.matlib具有一个repmat函数,其接口与Matlab函数相似

from numpy.matlib import repmat
repmat( np.array([[1],[1]]) , 1, 1)