问题:在NumPy中相当于MATLAB的repmat
我想使用NumPy执行以下MATLAB代码的等效项:repmat([1; 1], [1 1 1])
。我将如何完成?
回答 0
对于Matlab用户,这是一个更好(官方)的NumPy链接-恐怕其中的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
Python:
In [46]: a = np.array([[1],[1]])
In [47]: np.tile(a, [1,1,1])
Out[47]:
array([[[1],
[1]]])
回答 1
请注意,NumPy的广播机制已解决了需要使用MATLAB的repmat的某些原因,该机制使您可以使用形状相似的数组进行各种类型的数学运算。因此,如果您有一个表示3色图像的1600x1400x3数组,则可以(在元素上)相乘[1.0 0.25 0.25]
以减少每个像素的绿色和蓝色量。有关更多信息,请参见上面的链接。
回答 2
请参阅Matlab用户的NumPy。
Matlab:
repmat(a, 2, 3)
脾气暴躁:
numpy.kron(numpy.ones((2,3)), a)
Numpy中的Matlib(numpy.matlib.repmat()):
numpy.matlib.repmat(a, 2, 3)
回答 3
这就是我有点儿摆弄的方式。很高兴得到纠正,希望能有所帮助。
假设您有2×3个元素的矩阵M。显然,这有两个方面。
当要求沿着矩阵已经具有的维度操纵输入矩阵时,我看不到Matlab和Python之间的区别。因此这两个命令
repmat(M,m,n) % matlab
np.tile(M,(m,n)) # python
对于等级2(二维)的矩阵实际上是等效的。
当您要求重复/平铺比输入矩阵更多的维度时,事情变得与直觉相反。回到等级2和形状2×3的矩阵M,足以看出输出矩阵的大小/形状发生了什么。假设现在的操作顺序为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)的阅读方式。
在元件[:,:,0]
在Python答案Ñ将包含相同的值作为元素(:,:,1)
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),在rank-2数组中不可见。在那里,必须要小心,使用两种语言获得相同的结果将需要更多的预处理。
我知道这种推理可能不是一般性的,但我只能在目前为止得出结论。希望这会邀请其他人对其进行更严格的测试。
回答 4
认识tile
和repeat
。
x = numpy.arange(5)
print numpy.tile(x, 2)
print x.repeat(2)
回答 5
numpy.matlib有一个 repmat函数,其接口与matlab函数类似
from numpy.matlib import repmat
repmat( np.array([[1],[1]]) , 1, 1)
回答 6
>>> 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]])