Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么是MATLAB的等价物';努比的雷普马特_Python_Matlab_Numpy - Fatal编程技术网

Python 什么是MATLAB的等价物';努比的雷普马特

Python 什么是MATLAB的等价物';努比的雷普马特,python,matlab,numpy,Python,Matlab,Numpy,我想使用NumPy执行以下MATLAB代码的等效代码:repmat([1;1],[1])。我将如何完成此任务?请参阅 Matlab: repmat(a, 2, 3) >> repmat([1;1],[1,1,1]) ans = 1 1 努比: numpy.kron(numpy.ones((2,3)), a) Numpy()中的Matlib: 请注意,需要使用MATLAB的repmat的一些原因由NumPy的机制解决,它允许您使用形状相似的数组进行各种类型的

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

请参阅

Matlab:

repmat(a, 2, 3)
>> repmat([1;1],[1,1,1])

ans =
     1
     1
努比:

numpy.kron(numpy.ones((2,3)), a)
Numpy()中的Matlib:


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

这里有一个更好的(官方)链接-我担心mathesaurus one已经过时了

repmat(a,m,n)的numpy等价物为

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

Matlab:

repmat(a, 2, 3)
>> 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]]])

了解
平铺
重复

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

这就是我通过一点摆弄来理解它的方式。很高兴被纠正,希望这有帮助

假设您有一个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
为True

用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)
这是
大小的答案(repmat(M,1,1,2))
。我认为这是因为我们引导Python将第三维度添加到(2,3)的右侧,而不是其左侧,以便Python按照Matlab的方式读取序列(1,1,2)

N的Python答案中
[:,:,0]
中的元素将包含与
(:,:,1)
元素M的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),这在秩2数组中是不可见的。在这一点上,我们必须小心,用这两种语言获得相同的结果需要更多的预处理


我知道这个推理可能不是一般性的,但我只能得出这么远的结论。希望这会让其他人对它进行更艰难的测试。

>>将numpy作为np导入
>>> 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]])
>>>np.重复(['a','b',[2,5]) 数组(['a',a',b',b',b',b'],dtype='numpy.matlib有一个与matlab函数具有类似接口的函数

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

当我尝试使用size(repmat([1;1],[1,1,2])时,它得到ans=2 1 2[在matlab中],但在python np.tile(a,[1,1,2])。shape中它得到(1,2,2),我希望numpy给出与matlabnp.tile相同的结果(a[:,np.newaxis],[1,1,2])-它给出了相同的结果。问题是tile通过在必要时预先添加新的轴来将
a
提升到tile参数的维度。Matlab似乎是以另一种方式工作的。同样,使用4d平铺,您将需要两次newaxis…因此
np.tile(a[:,newaxis,newaxis],[1,2,3,4])=大小(repmat a[1,2,3,4])
根据需要…如果您使用
bsxfun
,Matlab也不能进行这种广播。这是最好的答案,因为它可以处理重复到新输出维度的重要情况。