How to reshape a matrix and then multiply it by another matrix and then reshape it again in python
我在将 python 与矩阵乘法和整形结合使用时遇到了问题。例如,我有一个大小为
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 重新整形为 16x1。
有人知道如何解决这个问题吗?
只需这样做:
1 2 3 4 | S.shape = (4,4) for ij in range(16): y[:,:,ij] = H[:,:,ij] @ S S.shape = -1 # equivalent to 16 |
请记住,Matlab 中的
所以给定形状
将
1 | np.moveaxis(np.dot(np.moveaxis(H, -1, 0), S.reshape(4, 4).T), 0, -1) |
内部
或者,您可以使用
的事实
1 | np.transpose(S.reshape(4, 4), np.transpose(H)) |
您的解决方案中有两个问题
1) reshape 方法采用单个元组参数形式的形状,而不是多个参数。
2) y 数组的形状应该是 16x1x16,而不是 4x4x16。在 Matlab 中,没有问题,因为它会在您更新时自动重塑
正确的版本如下:
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)) |