Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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
Python MATLAB Numpy元素级乘法问题_Python_Matlab_Numpy - Fatal编程技术网

Python MATLAB Numpy元素级乘法问题

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

请参阅下面的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    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]]])