我想使用NumPy执行以下MATLAB代码的等效代码:repmat([1; 1], [1 1 1]) .我该如何完成此操作?
repmat([1; 1], [1 1 1])
li9yvcax1#
这里有一个更好的(官方)NumPy for Matlab Users链接--恐怕mathesaurus已经过时了。repmat(a, m, n)的numpy等价物是tile(a, (m, n))。这适用于多个维度,并给出了与matlab类似的结果。(Numpy给出了一个3d输出数组,正如你所期望的- matlab出于某种原因给出了2d输出-但内容是相同的)。Matlab软件:
repmat(a, m, n)
tile(a, (m, n))
>> 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]]])
g6ll5ycj2#
请注意,NumPy的broadcasting机制可以解决使用MATLAB repmat的一些问题,它允许使用形状相似的数组进行各种类型的数学运算。你可以将它乘以[1.0 0.25 0.25]来减少每个像素的绿色和蓝色的数量。
[1.0 0.25 0.25]
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不同的形状。我们不能再Assertrepmat和tile是等效的指令。为了使tile的行为类似于repmat,在Python中,必须确保输入矩阵的维数与序列中元素的维数相同。
repmat
tile
N = M[:,:,np.newaxis]
然后,在输入端,有N.shape = (2,3,1)而不是M.shape = (2,3),在输出端
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当一个使用克罗内克积
size(repmat(M,1,1,2))
[:,:,0]
(:,:,1)
>>> np.kron(np.ones((1,1,2)),M).shape (1, 2, 6)
除非我把M前置到N中,所以我认为最常用的方法是使用np.newaxis的方法。当我们考虑秩为3的矩阵L(三维)和输出矩阵中没有添加新维度的简单情况时,游戏变得更加棘手。这两个看似等效的指令不会产生相同的结果
np.newaxis
repmat(L,p,q,r) % matlab np.tile(L,(p,q,r)) # python
因为行、列、平面外方向在Matlab中是(p,q,r),在Python中是(q,r,p),这在秩2数组中是不可见的。我知道这个推理可能并不普遍,但我只能做到这一点,希望这能引起其他人对它进行更严格的检验。
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)
ia2d9nvy5#
既知道tile又知道repeat。
repeat
x = numpy.arange(5) print numpy.tile(x, 2) print x.repeat(2)
ki0zmccv6#
matlib有一个repmat函数,其接口与matlab函数类似
from numpy.matlib import repmat repmat( np.array([[1],[1]]) , 1, 1)
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]])
7条答案
按热度按时间li9yvcax1#
这里有一个更好的(官方)NumPy for Matlab Users链接--恐怕mathesaurus已经过时了。
repmat(a, m, n)
的numpy等价物是tile(a, (m, n))
。这适用于多个维度,并给出了与matlab类似的结果。(Numpy给出了一个3d输出数组,正如你所期望的- matlab出于某种原因给出了2d输出-但内容是相同的)。
Matlab软件:
Python:
g6ll5ycj2#
请注意,NumPy的broadcasting机制可以解决使用MATLAB repmat的一些问题,它允许使用形状相似的数组进行各种类型的数学运算。你可以将它乘以
[1.0 0.25 0.25]
来减少每个像素的绿色和蓝色的数量。4bbkushb3#
这就是我如何从一点摆弄中理解它的。很高兴被纠正,希望这有帮助。
假设你有一个2x 3元素的矩阵M,它是二维的。
当要求沿着矩阵已有的维度操作输入矩阵时,我看不出Matlab和Python之间有什么区别。
对于秩为2(二维)的矩阵是等价的。
当你要求在比输入矩阵更多的维度上进行重复/平铺时,事情就变得与直觉相反了。回到秩为2、形状为2x 3的矩阵M,看看输出矩阵的大小/形状发生了什么就足够了。假设操作的序列现在是1,1,2。
在Matlab中
它已经复制了输入矩阵的前两个维度(行和列),并将其重复一次到新的第三个维度中(即复制两次)。
Python语言
它采用了不同的过程,因为我认为序列(1,1,2)的读取方式与Matlab不同。列、行和平面外维度方向上的副本数是从右向左读取的。生成的对象具有与Matlab不同的形状。我们不能再Assert
repmat
和tile
是等效的指令。为了使
tile
的行为类似于repmat
,在Python中,必须确保输入矩阵的维数与序列中元素的维数相同。然后,在输入端,有
N.shape = (2,3,1)
而不是M.shape = (2,3)
,在输出端这是
size(repmat(M,1,1,2))
的答案,我认为这是因为我们引导Python在(2,3)的右边而不是左边添加了第三个维度,所以Python按照Matlab的阅读方式计算出了序列(1,1,2)。在N的Python答案中,
[:,:,0]
中的元素将包含与M的Matlab答案中(:,:,1)
元素相同的值。最后,我似乎找不到一个等价的
repmat
当一个使用克罗内克积除非我把M前置到N中,所以我认为最常用的方法是使用
np.newaxis
的方法。当我们考虑秩为3的矩阵L(三维)和输出矩阵中没有添加新维度的简单情况时,游戏变得更加棘手。这两个看似等效的指令不会产生相同的结果
因为行、列、平面外方向在Matlab中是(p,q,r),在Python中是(q,r,p),这在秩2数组中是不可见的。
我知道这个推理可能并不普遍,但我只能做到这一点,希望这能引起其他人对它进行更严格的检验。
nwnhqdif4#
请参阅NumPy for Matlab users。
Matlab软件:
麻木:
Numpy中的Matlib(numpy.matlib.repmat()):
ia2d9nvy5#
既知道
tile
又知道repeat
。ki0zmccv6#
matlib有一个repmat函数,其接口与matlab函数类似
xuo3flqw7#