ver*_*crp 97 python matlab numpy
我想使用NumPy执行以下MATLAB代码的等价物:repmat([1; 1], [1 1 1]).我怎么做到这一点?
rob*_*nce 97
这是一个更好的(官方的)NumPy Matlab用户链接 - 我担心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
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
In [46]: a = np.array([[1],[1]])
In [47]: np.tile(a, [1,1,1])
Out[47]:
array([[[1],
[1]]])
Run Code Online (Sandbox Code Playgroud)
Matlab的:
repmat(a, 2, 3)
Run Code Online (Sandbox Code Playgroud)
NumPy的:
numpy.kron(numpy.ones((2,3)), a)
Run Code Online (Sandbox Code Playgroud)
这就是我有点儿摆弄的方式。很高兴得到纠正,希望能有所帮助。
假设您有2x3个元素的矩阵M。显然,这有两个方面。
当要求沿着矩阵已经具有的维度操纵输入矩阵时,我看不到Matlab和Python之间的区别。因此这两个命令
repmat(M,m,n) % matlab
np.tile(M,(m,n)) # python
Run Code Online (Sandbox Code Playgroud)
对于等级2(二维)的矩阵实际上是等效的。
当您要求重复/平铺比输入矩阵更多的维度时,事情变得与直觉相反。回到等级2和形状2x3的矩阵M,足以看出输出矩阵的大小/形状发生了什么。假设现在的操作顺序为1,1,2。
在Matlab中
> size(repmat(M,1,1,2))
ans =
2 3 2
Run Code Online (Sandbox Code Playgroud)
它已经复制了输入矩阵的前两个维(行和列),并已将其重复一次到新的第三个维(即复制了两次)。repmat符合重复矩阵的命名。
在Python中
>>> np.tile(M,(1,1,2)).shape
(1, 2, 6)
Run Code Online (Sandbox Code Playgroud)
它采用了不同的过程,因为我认为序列(1,1,2)的读取方式与Matlab中的读取方式不同。从右到左读取列,行和平面外尺寸方向的份数。生成的对象具有与Matlab不同的形状。人们可以不再断言repmat和tile等价指令。
为了变得tile像repmat,在Python中必须确保输入矩阵的维数与序列中的元素一样多。例如,这可以通过一些预处理并创建相关对象N来完成。
N = M[:,:,np.newaxis]
Run Code Online (Sandbox Code Playgroud)
然后,在输入端有N.shape = (2,3,1)而不是M.shape = (2,3)和在输出端
>>> np.tile(N,(1,1,2)).shape
(2, 3, 2)
Run Code Online (Sandbox Code Playgroud)
这是的答案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)
Run Code Online (Sandbox Code Playgroud)
除非我如上所述将M前提为N。因此,我认为继续前进的最一般方法是使用np.newaxis。
当我们考虑等级3(三个维度)的矩阵L以及在输出矩阵中不添加任何新维度的简单情况时,游戏将变得更加棘手。这两个看似等效的指令将不会产生相同的结果
repmat(L,p,q,r) % matlab
np.tile(L,(p,q,r)) # python
Run Code Online (Sandbox Code Playgroud)
因为行,列和平面外方向在Matlab中是(p,q,r)在Python中是(q,r,p),在rank-2数组中不可见。在那里,必须谨慎,使用两种语言获得相同的结果将需要更多的预处理。
我知道这种推理可能不是一般性的,但我只能在目前为止得出结论。希望这会邀请其他人对其进行更严格的测试。
知道这两个tile和repeat.
x = numpy.arange(5)
print numpy.tile(x, 2)
print x.repeat(2)
Run Code Online (Sandbox Code Playgroud)