前言
最近在 librosa (一个用来处理信号的库)中遇到复数操作,主要是要将复数矩阵(n x m)变成矩阵(n x m x 2),然后返回到复数矩阵。
复数(n x m)转矩阵(n x m x 2)
代码:
# 生成复数矩阵a
a = np.array([[1,2+3.j,3,4], [5,6,7+1.j,8], [9,10,11,12]], dtype=np.complex64)
print(a)
# 转成矩阵b
b=np.stack([np.real(a), np.imag(a)], axis=-1)
print(b)
输出:
[[ 1.+0.j 2.+3.j 3.+0.j 4.+0.j]
[ 5.+0.j 6.+0.j 7.+1.j 8.+0.j]
[ 9.+0.j 10.+0.j 11.+0.j 12.+0.j]]
[[[ 1. 0.]
[ 2. 3.]
[ 3. 0.]
[ 4. 0.]]
[[ 5. 0.]
[ 6. 0.]
[ 7. 1.]
[ 8. 0.]]
[[ 9. 0.]
[ 10. 0.]
[ 11. 0.]
[ 12. 0.]]]
矩阵(n x m x 2)转复数(n x m)
代码:
# 生成 矩阵 b
a = np.array([[1,2+3.j,3,4], [5,6,7+1.j,8], [9,10,11,12]], dtype=np.complex64)
b=np.stack([np.real(a), np.imag(a)], axis=-1)
print(b)
# 转换成复数矩阵
r_a=1j*b[:,:,1]
r_a+= b[:,:,0]
print(r_a)
# 无差
print(r_a-a)
输出:
[[[ 1. 0.]
[ 2. 3.]
[ 3. 0.]
[ 4. 0.]]
[[ 5. 0.]
[ 6. 0.]
[ 7. 1.]
[ 8. 0.]]
[[ 9. 0.]
[ 10. 0.]
[ 11. 0.]
[ 12. 0.]]]
[[ 1.+0.j 2.+3.j 3.+0.j 4.+0.j]
[ 5.+0.j 6.+0.j 7.+1.j 8.+0.j]
[ 9.+0.j 10.+0.j 11.+0.j 12.+0.j]]
[[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[ 0.+0.j 0.+0.j 0.+0.j 0.+0.j]]