Taka's blog

Techネタなど

PythonのNumpyで複素数の相関係数を計算したかった

アブスト

Python3.5で@演算子による行列計算ができるようになった(y=A@x)

のを機に,Pythonで研究を進めた.

複素数をバリバリに扱う内容で,numpy.corrcoefに複素数を適当に突っ込んだら全く意図しない挙動を示した.

corrcoefが複素数に対応していないのかと思って自力で実装したりしたが,結局Pythonが悪いのではなく,自分が突っ込んだ数列がマズかった.

 

問題の挙動

以下のコードで確認できます.

import numpy as np
s1=np.array([1+1.0j,1+2.0j])
s2=np.array([1+1.0j,1+1.0j])
cor = np.corrcoef(s1,s2)
print(cor) 

 

# [[  1. +0.j  nan+nanj]
#  [ nan+nanj  nan+nanj]]

 

原因

信号のエネルギーが0だと,分散が0になり,結果0除算になってNaNになる.

上記の例ではs2が直流(信号のエネルギーは0)となっている.