在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)
知道tile
和repeat
。
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有不同的形状。 人们不能断言repmat
和tile
是等效的指令。
为了让tile
像repmat
一样工作,在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数组中是不可见的。 在那里,人们必须小心,获得相同的结果与两种语言将需要更多的预处理。
我知道这个推理可能不是一般的,但是我可以把它解决这个问题。 希望这会引起其他研究人员的更大的考验。