在NumPy中相当于MATLAB的repmat


103

我想使用NumPy执行以下MATLAB代码的等效项:repmat([1; 1], [1 1 1])。我将如何完成?

Answers:


103

对于Matlab用户,这是一个更好(官方)的NumPy链接-恐怕其中的Mathesaurus已经过时了。

的numpy的当量repmat(a, m, n)tile(a, (m, n))

这适用于多个维度,并提供与matlab类似的结果。(Numpy提供了3d输出数组,正如您期望的那样-由于某种原因,matlab提供了2d输出-但内容相同)。

Matlab:

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

ans =
     1
     1

蟒蛇:

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

2
当我尝试size(repmat([1; 1],[1,1,2]))时,它的解析度为ans = 2 1 2 [在matlab中],但在python np.tile(a,[1,1,2])中.shape它get(1、2、2),我希望numpy给出与matlab相同的结果
vernomcrp

2
np.tile(a [:,np.newaxis],[1,1,2])-相同。问题在于a贴通过在必要时添加新轴来提升贴参数的尺寸。Matlab似乎以其他方式工作。同样,使用4d平铺时,您将需要两次newaxis ...因此,np.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4]))根据需要...
robince

17

请注意,NumPy的广播机制已解决了需要使用MATLAB的repmat的某些原因,该机制使您可以使用形状相似的数组进行各种类型的数学运算。因此,如果您有一个表示3色图像的1600x1400x3数组,则可以(在元素上)相乘[1.0 0.25 0.25]以减少每个像素的绿色和蓝色量。有关更多信息,请参见上面的链接。


2
如果您使用,则Matlab也不能进行此广播bsxfun
Gerrit


8

这就是我有点儿摆弄的方式。很高兴得到纠正,希望能有所帮助。

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


当要求沿着矩阵已经具有的维度操纵输入矩阵时,我看不到Matlab和Python之间的区别。因此这两个命令

repmat(M,m,n) % matlab

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

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


当您要求重复/平铺比输入矩阵更多的维度时,事情变得与直觉相反。回到等级2和形状2x3的矩阵M,足以看出输出矩阵的大小/形状发生了什么。假设现在的操作顺序为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等价指令。


为了变得tilerepmat,在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)的阅读方式。

在元件[:,:,0]在Python答案Ñ将包含相同的值作为元素(:,:,1)Matlab的答案中号


最后,我似乎找不到repmat当人使用Kronecker产品的等效产品

>>> 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数组中不可见。在那里,必须要小心,使用两种语言获得相同的结果将需要更多的预处理。


我知道这种推理可能不是一般性的,但我只能在目前为止得出结论。希望这会邀请其他人对其进行更严格的测试。



1

numpy.matlib有一个 repmat函数,其接口与matlab函数类似

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

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]])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.