我试图做一些numpy矩阵数学运算,因为我需要从MATLAB复制repmat函数。我知道网上有上千个示例,但我似乎无法使其中的任何一个正常工作。
def getDMap(image, mapSize):
newSize = (float(mapSize[0]) / float(image.shape[1]), float(mapSize[1]) / float(image.shape[0]))
sm = cv.resize(image, (0,0), fx=newSize[0], fy=newSize[1])
for j in range(0, sm.shape[1]):
for i in range(0, sm.shape[0]):
dmap = sm[:,:,:]-np.array([np.tile(sm[j,i,:], (len(sm[0]), len(sm[1]))) for k in xrange(len(sm[2]))])
return dmap
函数getDMap(image,mapSize)需要一个OpenCV2 HSV图像作为其图像参数,它是一个3维的numpy数组:[:,:,:]
。它还期望一个包含2个元素的元组作为其imSize参数,当然要确保传递参数的函数考虑到在numpy数组中行和列被交换(不是:x,y,而是:y,x)。
然后,newSize包含一个包含分数的元组,这些分数用于将输入图像调整为特定比例,并且sm成为输入图像的调整大小版本。这一切都很好。
下一行:
np.array([np.tile(sm[i,j,:], (len(sm[0]), len(sm[1]))) for k in xrange(len(sm[2]))])
,
功能应等同于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(len(sm [2]))])
ValueError:操作数无法与形状(48,64,3)(64,64,192)一起广播
因此,似乎数组尺寸不匹配,而numpy对此有问题。但是我的问题是什么?我该如何工作呢?
这两个计算匹配:
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 = ...
您只会从上次迭代中获得结果。你要data += ...
吗?如果是这样,这可能会起作用(对于(N,M,K)形状的sm
)
np.sum(np.array([sm-np.tile(sm[i,j,:], (N,M,1)) for i in xrange(N) for j in xrange(M)]),axis=0)
z = np.array([np.tile(sm[i,j,:], (N,M,1)) for i in xrange(N) for j in xrange(M)]),axis=0)
np.sum(sm - z, axis=0) # let numpy broadcast 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
我要扩大(和和)2个维度:
x5 = np.sum(np.sum(sm[None,:,None,:,:]-sm[:,None,:,None,:],0),1)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句