Python MATLAB Numpy元素级乘法问题
请参阅下面的MATLAB代码和等效Numpy代码。 问题:如何在Numpy中获得与MATLAB相同的D变量 MATLAB代码Python MATLAB Numpy元素级乘法问题,python,matlab,numpy,Python,Matlab,Numpy,请参阅下面的MATLAB代码和等效Numpy代码。 问题:如何在Numpy中获得与MATLAB相同的D变量 MATLAB代码 A=[1234;456;789] C=[100 1;10 0.1;1,0.01] C=重塑(C,1,3,2) D=bsxfun(@times,A,C) D(:,:,1)= 100 20 3 400 50 6 700 80 9 D(:,:,2)= 1.0000 0.2000 0.0300 4.0000 0.5000
A=[1234;456;789]
C=[100 1;10 0.1;1,0.01]
C=重塑(C,1,3,2)
D=bsxfun(@times,A,C)
D(:,:,1)=
100 20 3
400 50 6
700 80 9
D(:,:,2)=
1.0000 0.2000 0.0300
4.0000 0.5000 0.0600
7.0000 0.8000 0.0900
Numpy代码
A=np.array([[1,2,3],[4,5,6],[7,8,9])
C=np.数组([[[100,1],[10,0.1],[1,0.01]])#C.形状为(1,3,2)
D=A*C.T
D
数组([[100,200,300.],
[ 40. , 50. , 60. ],
[ 7. , 8. , 9. ]],
[[ 1. , 2. , 3. ],
[ 0.4 , 0.5 , 0.6 ],
[ 0.07, 0.08, 0.09]]])
您向C
添加了一个转置,这在MATLAB代码中不存在
如果希望保持完全相同的数据布局,请在a
中插入一个尾随单例维度。在MATLAB中,尾随单例是隐式的,在numpy中,前导单例是隐式的:
>>> D = A[...,None] * C.squeeze()
>>> D
array([[[1.e+02, 1.e+00],
[2.e+01, 2.e-01],
[3.e+00, 3.e-02]],
[[4.e+02, 4.e+00],
[5.e+01, 5.e-01],
[6.e+00, 6.e-02]],
[[7.e+02, 7.e+00],
[8.e+01, 8.e-01],
[9.e+00, 9.e-02]]])
这里,A[…,None]
有shape(3,3,1)
和C.squence()
只是撤销了多余的前导单态维度,使其形成(3,2)
这些广播到shape(3,3,2)
。MATLAB和numpy对多维数组的解释不同,这解释了为什么上面的repr
对应于三个shape(3,2)
数组,而MATLAB显示了两个shape(3,3
)数组。但实际上是同一个数组:
>>> D[..., 0]
array([[100., 20., 3.],
[400., 50., 6.],
[700., 80., 9.]])
>>> D[..., 1]
array([[1. , 0.2 , 0.03],
[4. , 0.5 , 0.06],
[7. , 0.8 , 0.09]])
请注意,如果您在numpy代码中保持MATLAB顺序,您可能希望在数组中使用fortran布局,否则您将在numpy代码中的次优位置使用“快速”轴。您将转置添加到
C
,这在MATLAB代码中不存在
如果希望保持完全相同的数据布局,请在a
中插入一个尾随单例维度。在MATLAB中,尾随单例是隐式的,在numpy中,前导单例是隐式的:
>>> D = A[...,None] * C.squeeze()
>>> D
array([[[1.e+02, 1.e+00],
[2.e+01, 2.e-01],
[3.e+00, 3.e-02]],
[[4.e+02, 4.e+00],
[5.e+01, 5.e-01],
[6.e+00, 6.e-02]],
[[7.e+02, 7.e+00],
[8.e+01, 8.e-01],
[9.e+00, 9.e-02]]])
这里,A[…,None]
有shape(3,3,1)
和C.squence()
只是撤销了多余的前导单态维度,使其形成(3,2)
这些广播到shape(3,3,2)
。MATLAB和numpy对多维数组的解释不同,这解释了为什么上面的repr
对应于三个shape(3,2)
数组,而MATLAB显示了两个shape(3,3
)数组。但实际上是同一个数组:
>>> D[..., 0]
array([[100., 20., 3.],
[400., 50., 6.],
[700., 80., 9.]])
>>> D[..., 1]
array([[1. , 0.2 , 0.03],
[4. , 0.5 , 0.06],
[7. , 0.8 , 0.09]])
请注意,如果您在numpy代码中保持MATLAB顺序,您可能希望在数组中使用fortran布局,否则您将在numpy代码中的次优位置使用“快速”轴。您很接近。可以通过将矩阵的转置相乘,然后使用交换矩阵转置最终的子矩阵来实现这一点
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
C = np.array([[[100, 1], [10, 0.1], [1, 0.01]]]) # C.shape is (1, 3, 2)
D = (A.T*C.T)
D = D.swapaxes(1,2)
您还可以将这些线组合为
D = (A.T*C.T).swapaxes(1,2)
输出
array([[[1.e+02, 2.e+01, 3.e+00],
[4.e+02, 5.e+01, 6.e+00],
[7.e+02, 8.e+01, 9.e+00]],
[[1.e+00, 2.e-01, 3.e-02],
[4.e+00, 5.e-01, 6.e-02],
[7.e+00, 8.e-01, 9.e-02]]])
你很接近。可以通过将矩阵的转置相乘,然后使用交换矩阵转置最终的子矩阵来实现这一点
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
C = np.array([[[100, 1], [10, 0.1], [1, 0.01]]]) # C.shape is (1, 3, 2)
D = (A.T*C.T)
D = D.swapaxes(1,2)
您还可以将这些线组合为
D = (A.T*C.T).swapaxes(1,2)
输出
array([[[1.e+02, 2.e+01, 3.e+00],
[4.e+02, 5.e+01, 6.e+00],
[7.e+02, 8.e+01, 9.e+00]],
[[1.e+00, 2.e-01, 3.e-02],
[4.e+00, 5.e-01, 6.e-02],
[7.e+00, 8.e-01, 9.e-02]]])