How to reshape a matrix and then multiply it by another matrix and then reshape it again in python

我在将 python 与矩阵乘法和整形结合使用时遇到了问题。例如,我有一个大小为 (16,1) 的列 S 和另一个大小为 (4,4) 的矩阵 H ,我需要将列 S 重新整形为 (4,4) 以便将它与 H 相乘并且然后再次将其重新整形为 (16,1) ,我在 matlab 中进行了如下操作:

1
2
3
4
5
6
7
clear all ; clc ; clear
H = randn ( 4 , 4 , 16 ) + 1j.*randn ( 4 , 4 , 16 ) ;
S = randn ( 16 , 1 ) + 1j.*randn ( 16 , 1 ) ;
for ij = 1 : 16
    y (: ,: ,ij )     = reshape (H (: ,: ,ij )*reshape (S , 4 , [ ] ) , [ ] , 1 ) ;
end  
y = mean (y , 3 ) ;

来到python:

1
2
3
4
5
6
7
import numpy as np

H = np. random. randn ( 4 , 4 , 16 ) + 1j * np. random. randn ( 4 , 4 , 16 )
S = np. random. randn ( 16 , ) + 1j * np. random. randn ( 16 , )
y = np. zeros ( ( 4 , 4 , 16 ) ,dtype = complex )
for ij in range ( 16 ):
    y [: ,: ,ij ] = np. reshape (h [: ,: ,ij ] @S. reshape ( 4 , 4 ) , 16 , 1 )

但是我在这里得到一个错误,我们无法将大小为 256 的矩阵 y 重新整形为 16×1。

有人知道如何解决这个问题吗?


只需这样做:

1
2
3
4
S. shape = ( 4 , 4 )
for ij in range ( 16 ):
    y [: ,: ,ij ] = H [: ,: ,ij ] @ S
S. shape =1 # equivalent to 16



相关讨论

  • 您可以只使用 S.reshape(4, 4) 返回的临时视图,而不是修改原始数组对象。


np.dot 如果两个操作数有两个或多个轴,则对两个操作数的最后一个和倒数第二个轴进行操作。你可以移动你的轴来使用它。

请记住,Matlab 中的 reshape(S, 4, 4) 可能等同于 Python 中的 S.reshape(4, 4).T 。

所以给定形状 (4, 4, 16) 的 H 和形状 (16,) 的 S ,您可以使用

将 H 的每个通道乘以重新整形的 S

1 np. moveaxis (np. dot (np. moveaxis (H ,1 , 0 ) , S. reshape ( 4 , 4 ). T ) , 0 ,1 )

内部 moveaxis 调用使 H 变为 (16, 4, 4) 以便于乘法。外面的效果相反。

或者,您可以使用 S 将被转置为 write

的事实

1 np. transpose (S. reshape ( 4 , 4 ) , np. transpose (H ) )



相关讨论

  • 是的,这与 MIMO 信道和长度 = 16 的多径信道有关。你在那个领域工作吗?我这样做是对的吗?
  • @Gze。不幸的是我不知道。我只是习惯于从图像处理应用程序中调用第三维”通道”。我不知道你在做什么在概念上是否正确,但如果是,这就是这样做的方法。
  • 您能否用我应该使用的完整代码更新答案?
  • @Gze。我可以,但是您的 Matlab 与您的散文不匹配。我正在尝试复制您的 Matlab,所以如果您可以匹配,我会将调用添加到 mean


您的解决方案中有两个问题

1) reshape 方法采用单个元组参数形式的形状,而不是多个参数。

2) y 数组的形状应该是 16x1x16,而不是 4x4x16。在 Matlab 中,没有问题,因为它会在您更新时自动重塑 y 。

正确的版本如下:

1
2
3
4
5
6
7
import numpy as np

H = np. random. randn ( 4 , 4 , 16 ) + 1j * np. random. randn ( 4 , 4 , 16 )
S = np. random. randn ( 16 , ) + 1j * np. random. randn ( 16 , )
y = np. zeros ( ( 16 , 1 , 16 ) ,dtype = complex )
for ij in range ( 16 ):
    y [: ,: ,ij ] = np. reshape (H [: ,: ,ij ] @S. reshape ( ( 4 , 4 ) ) , ( 16 , 1 ) )



相关讨论

  • .. 所以平均值(y,3);在 matlab 中可以使用 python 中的 np.mean(y,3) 来完成吗?
  • @Gze 在 python 中,您指定要平均数组的轴。我想你想要 np.mean(y,axis=2) ,因为枚举从 python 中的 0 开始。假设您的 Matlab 代码是正确的,我会检查 Python 版本的一致性
  • 抱歉,但是现在从 y = np.mean(y,axis=2) 得到的 y 的形状是 (16,1) 如果我想要它的形状是 (16,)
  • @MadPhysicist 不幸的是我得到了不同的结果!你的意思是这里有错误? ..我会试试你的解决方案
  • @MadPhysicist,你能扩展一下吗?它说整数或整数元组。 docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.h??tml
  • OP 使用的是数组方法 np.ndarray.reshape ,而不是函数。请参阅链接中的注释。


声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。