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

xhv8bpkk  于 2022-12-13  发布在  Matlab
关注(0)|答案(7)|浏览(174)

我想使用NumPy执行以下MATLAB代码的等效代码:repmat([1; 1], [1 1 1]) .我该如何完成此操作?

li9yvcax

li9yvcax1#

这里有一个更好的(官方)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]]])
g6ll5ycj

g6ll5ycj2#

请注意,NumPy的broadcasting机制可以解决使用MATLAB repmat的一些问题,它允许使用形状相似的数组进行各种类型的数学运算。你可以将它乘以[1.0 0.25 0.25]来减少每个像素的绿色和蓝色的数量。

4bbkushb

4bbkushb3#

这就是我如何从一点摆弄中理解它的。很高兴被纠正,希望这有帮助。
假设你有一个2x 3元素的矩阵M,它是二维的。
当要求沿着矩阵已有的维度操作输入矩阵时,我看不出Matlab和Python之间有什么区别。

repmat(M,m,n) % matlab

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

对于秩为2(二维)的矩阵是等价的。
当你要求在比输入矩阵更多的维度上进行重复/平铺时,事情就变得与直觉相反了。回到秩为2、形状为2x 3的矩阵M,看看输出矩阵的大小/形状发生了什么就足够了。假设操作的序列现在是1,1,2。
在Matlab中

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

    2   3   2

它已经复制了输入矩阵的前两个维度(行和列),并将其重复一次到新的第三个维度中(即复制两次)。
Python语言

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

它采用了不同的过程,因为我认为序列(1,1,2)的读取方式与Matlab不同。列、行和平面外维度方向上的副本数是从右向左读取的。生成的对象具有与Matlab不同的形状。我们不能再Assertrepmattile是等效的指令。
为了使tile的行为类似于repmat,在Python中,必须确保输入矩阵的维数与序列中元素的维数相同。

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)元素相同的值。
最后,我似乎找不到一个等价的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),这在秩2数组中是不可见的。
我知道这个推理可能并不普遍,但我只能做到这一点,希望这能引起其他人对它进行更严格的检验。

nwnhqdif

nwnhqdif4#

请参阅NumPy for Matlab users
Matlab软件:

repmat(a, 2, 3)

麻木:

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

Numpy中的Matlib(numpy.matlib.repmat()):

numpy.matlib.repmat(a, 2, 3)
ia2d9nvy

ia2d9nvy5#

既知道tile又知道repeat

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

ki0zmccv6#

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

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

xuo3flqw7#

>>> 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]])

相关问题