Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
Arrays 尽管网上有很多例子,但我无法让我的MATLAB repmat等价物在python中工作_Arrays_Matlab_Python 2.7_Numpy_Tile - Fatal编程技术网

Arrays 尽管网上有很多例子,但我无法让我的MATLAB repmat等价物在python中工作

Arrays 尽管网上有很多例子,但我无法让我的MATLAB repmat等价物在python中工作,arrays,matlab,python-2.7,numpy,tile,Arrays,Matlab,Python 2.7,Numpy,Tile,我试图做一些numpy矩阵数学,因为我需要从MATLAB复制repmat函数。我知道网上有上千个例子,但我似乎无法让其中任何一个起作用 以下是我尝试运行的代码: 函数getDMap(image,mapSize)需要一个OpenCV2 HSV图像作为其image参数,它是一个具有3维的numpy数组:[:,:,:]。它还需要一个包含2个元素的元组作为其imSize参数,当然要确保传递参数的函数考虑到在numpy数组中交换行和列(不是:x,y,,而是:y,x) newSize然后包含一个元组,其中包

我试图做一些numpy矩阵数学,因为我需要从MATLAB复制repmat函数。我知道网上有上千个例子,但我似乎无法让其中任何一个起作用

以下是我尝试运行的代码: 函数getDMap(image,mapSize)需要一个OpenCV2 HSV图像作为其image参数,它是一个具有3维的numpy数组:
[:,:,:]
。它还需要一个包含2个元素的元组作为其imSize参数,当然要确保传递参数的函数考虑到在numpy数组中交换行和列(不是:x,y,,而是:y,x)

newSize然后包含一个元组,其中包含用于将输入图像调整到特定比例的分形,并且sm成为输入图像的调整大小版本。这一切都很好

这是我的目标: 以下一行:

np.array([np.tile(sm[i,j,:],(len(sm[0]),len(sm[1]))用于xrange(len(sm[2]))中的k)

应与MATLAB表达式等效的函数:

repmat(sm(j,i,:),[size(sm,1)size(sm,2)])

这是我的问题: 为此,尺寸为800x479x3的OpenCV2图像作为图像参数传递,而(64,48)(一个元组)作为imSize参数传递。 但是,在测试时,我得到以下ValueError:

dmap=sm[:,:,:]-np.array([np.tile(sm[i,j,:],(len(sm[0]),和, len(sm[1]))表示xrange中的k(len(sm[2]))]
ValueError:操作数无法与一起广播 形状(48,64,3)(64,64192)


因此,数组维度似乎不匹配,numpy对此存在问题。但我的问题是什么?我该如何使其工作?

len(sm[0])
len(sm[1])
不是
sm
的第一维度和第二维度的大小。它们是
sm
的第一行和第二行的长度,应该返回相同的值。您可能想用
sm.shape[0]
sm.shape[1]
替换它们,它们与您的Matlab代码相当,尽管我不确定它是否会像您预期的那样工作。

len(sm[0])
len(sm[1])
不是
sm的第一维和第二维的大小。它们是
sm
的第一行和第二行的长度,应该返回相同的值。您可能希望将它们替换为
sm.shape[0]
sm.shape[1]
,它们与您的Matlab代码等效,尽管我不确定它是否会像您预期的那样工作。

这两个计算匹配:

octave:26> sm=reshape(1:12,2,2,3)
octave:27> x=repmat(sm(1,2,:),[size(sm,1) size(sm,2)])
octave:28> x(:,:,2)
   7   7
   7   7


In [45]: sm=np.arange(1,13).reshape(2,2,3,order='F')
In [46]: x=np.tile(sm[0,1,:],[sm.shape[0],sm.shape[1],1])
In [47]: x[:,:,1]
Out[47]: 
array([[7, 7],
       [7, 7]])
这是:

 sm[:,:,:]-np.array([np.tile(sm[0,1,:], (2,2,1)) for k in xrange(3)])
但它会生成一个(3,2,2,3)数组,并在第一维上进行复制。我认为你不想要那种
k
循环

你的意图是什么

 for i in ...:
     for j in ...:
         data = ...
您只能从上一次迭代中获得结果。您想要
数据+=…
?如果是这样,这可能会起作用(对于(N,M,K)形状的
sm

事实上,我甚至不需要瓷砖。让广播来做这项工作:

 np.sum(np.array([sm-sm[i,j,:] for i in xrange(N) for j in xrange(M)]),axis=0)
我可以通过
repeat
消除循环

sm1 = sm.reshape(N*M,L)  # combine 1st 2 dim to simplify repeat
z1 = np.repeat(sm1, N*M, axis=0).reshape(N*M,N*M,L)
x1 = np.sum(sm1 - z1, axis=0).reshape(N,M,L)
我也可以将广播应用于最后一个案例

x4 = np.sum(sm1-sm1[:,None,:], 0).reshape(N,M,L)
# = np.sum(sm1[None,:,:]-sm1[:,None,:], 0).reshape(N,M,L)
使用
sm
我必须展开(和求和)两个维度:

x5 = np.sum(np.sum(sm[None,:,None,:,:]-sm[:,None,:,None,:],0),1)

这两种计算结果相匹配:

octave:26> sm=reshape(1:12,2,2,3)
octave:27> x=repmat(sm(1,2,:),[size(sm,1) size(sm,2)])
octave:28> x(:,:,2)
   7   7
   7   7


In [45]: sm=np.arange(1,13).reshape(2,2,3,order='F')
In [46]: x=np.tile(sm[0,1,:],[sm.shape[0],sm.shape[1],1])
In [47]: x[:,:,1]
Out[47]: 
array([[7, 7],
       [7, 7]])
这是:

 sm[:,:,:]-np.array([np.tile(sm[0,1,:], (2,2,1)) for k in xrange(3)])
但它会生成一个(3,2,2,3)数组,并在第一维上进行复制。我认为你不想要那种
k
循环

你的意图是什么

 for i in ...:
     for j in ...:
         data = ...
您只能从上一次迭代中获得结果。您想要
数据+=…
?如果是这样,这可能会起作用(对于(N,M,K)形状的
sm

事实上,我甚至不需要瓷砖。让广播来做这项工作:

 np.sum(np.array([sm-sm[i,j,:] for i in xrange(N) for j in xrange(M)]),axis=0)
我可以通过
repeat
消除循环

sm1 = sm.reshape(N*M,L)  # combine 1st 2 dim to simplify repeat
z1 = np.repeat(sm1, N*M, axis=0).reshape(N*M,N*M,L)
x1 = np.sum(sm1 - z1, axis=0).reshape(N,M,L)
我也可以将广播应用于最后一个案例

x4 = np.sum(sm1-sm1[:,None,:], 0).reshape(N,M,L)
# = np.sum(sm1[None,:,:]-sm1[:,None,:], 0).reshape(N,M,L)
使用
sm
我必须展开(和求和)两个维度:

x5 = np.sum(np.sum(sm[None,:,None,:,:]-sm[:,None,:,None,:],0),1)

谢谢,多亏了你的解释,我已经解决了。我没有完全理解阵列内部应该发生什么。具有讽刺意味的是,在实现解决方案之后,我发现有一个函数numpy.matlib.repmat()正好满足了我的要求。。无论如何,谢谢你的帮助!那
matlab.repmat
最后做了一整串
restrape
repeat
s:
a.restrape(1,a.size.).repeat(m,0).restrape(rows,origcols).repat(n,0)
的八度版本
repmat
使用
restrape
s和
one(1,p)
<代码>重塑
添加或合并维度,
一个
扩展所选维度。我使用广播发现问题的对称性,使
repmat
模糊。谢谢,感谢您的解释,我已经解决了这个问题。我没有完全理解阵列内部应该发生什么。具有讽刺意味的是,在实现解决方案之后,我发现有一个函数numpy.matlib.repmat()正好满足了我的要求。。无论如何,谢谢你的帮助!那
matlab.repmat
最后做了一整串
restrape
repeat
s:
a.restrape(1,a.size.).repeat(m,0).restrape(rows,origcols).repat(n,0)
的八度版本
repmat
使用
restrape
s和
one(1,p)
<代码>重塑添加或合并维度,
一个
扩展选定维度。我发现问题的对称性是使用广播使
repmat
模糊。关于DIM,您是对的。我本可以用np.size()来做这件事。你说的dims是对的。我可以使用np.size()来实现这一点。repmat在使用代码的Numpy中很少需要,因为广播以更一般的方式提供相同的函数。repmat在使用代码的Numpy中很少需要,因为广播以更一般的方式提供相同的函数。