我正在尝试转换一段MATLAB代码,这是我正在努力的一条线:
f = 0
wlab = reshape(bsxfun(@times,cat(3,1-f,f/2,f/2),lab),[],3)
我想出了
wlab = lab*(np.concatenate((3,1-f,f/2,f/2)))
我现在如何重塑它?
答案 0 :(得分:5)
不会为您的代码执行此操作,但更多是作为一般知识:
bsxfun
是一个填补MATLAB的空白的函数,python不需要填充:广播。
广播是这样的事情:如果正在乘法/相加的矩阵/任何类似的矩阵与正在使用的另一个矩阵的大小不同,则矩阵将被重复。
所以在python中,如果你有一个3D矩阵A
并且你想要将它的每个2D切片与2D的矩阵B
相乘,你不需要任何其他东西,python将广播{ {1}}对你来说,它会一次又一次地重复矩阵。 B
就足够了。但是,在MATLAB中会引发错误A*B
。为了解决这个问题,您将Matrix dimension mismatch
用作bsxfun
,这将在bsxfun(@times,A,B)
的第三维上广播(重复)B
。
这意味着将A
转换为python通常不需要任何内容。
答案 1 :(得分:2)
MATLAB
reshape(x,[],3)
相当于numpy
np.reshape(x,(-1,3))
[]
和-1
是占位符,以便在这里填写正确的形状'。
===============
我刚试过MATLAB表达式是Octave - 它在不同的机器上,所以我只是总结一下这个动作。
对于lab=1:6
(6个元素),bsxfun
产生(1,6,3)矩阵; reshape
将其转换为(6,3),即只删除第一个维度。 cat
生成一个(1,1,3)矩阵。
np.reshape(np.array([1-f,f/2,f/2])[None,None,:]*lab[None,:,None],(-1,3))
对于具有形状(n,m)的lab
,bsxfun
产生(n,m,3)矩阵;重塑将成为它(n * m,3)
因此对于2d lab
,numpy
需要
np.array([1-f,f/2,f/2])[None,None,:]*lab[:,:,None]
(在MATLAB中,lab
将始终为2d(或更大),因此即使n
为1,第二种情况也更接近其动作。
=======================
np.array([1-f,f/2,f/2])*lab[...,None]
会处理任何形状lab
如果我制作Octave lab
(4,2,3),`bsxfun也是(4,2,3)
匹配的numpy表达式将是
In [94]: (np.array([1-f,f/2,f/2])*lab).shape
Out[94]: (4, 2, 3)
numpy
将尺寸添加到(3,)数组的开头以匹配lab
的尺寸,实际上
(np.array([1-f,f/2,f/2])[None,None,:]*lab) # for 3d lab
如果f=0
,则数组为[1,0,0]
,因此这会使lab
的最后一个维度上的值归零。实际上,改变了颜色'。
答案 2 :(得分:0)
相当于
import numpy as np
wlab = np.kron([1-f,f/2,f/2],lab.reshape(-1,1))
答案 3 :(得分:0)
在Python中,如果您使用numpy,则不需要进行任何广播,因为这是自动完成的。
例如,查看以下代码应该更清楚:
>>> import numpy as np
>>> a = np.array([[1, 2, 3], [3, 4, 5], [6, 7, 8], [9, 10, 100]])
>>> b = np.array([1, 2, 3])
>>>
>>> a
array([[ 1, 2, 3],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 100]])
>>> b
array([1, 2, 3])
>>>
>>> a - b
array([[ 0, 0, 0],
[ 2, 2, 2],
[ 5, 5, 5],
[ 8, 8, 97]])
>>>