我想使用NumPy执行以下MATLAB代码的等效代码:repmat([1; 1], [1 1 1])
。我该如何做到这一点?
答案 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)
答案 3 :(得分:5)
了解tile
和repeat
。
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具有不同的形状。人们不能断言repmat
和tile
是等效的指令。
为了让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)