静かなる名辞

pythonとプログラミングのこと


【python】scipy.statsのzscoreで警告が出るときの対策

概要

 z得点を計算しようとしたとき、このような警告を見かけることがあります。

RuntimeWarning: invalid value encountered in true_divide

 これが出た場合、結果にはnanが含まれています。なので後段の分析で落ちたりします。

>>> import numpy as np
>>> from scipy.stats import zscore
>>> a = np.array([[1,2,3,4], [1,2,3,4],[1,3,4,5]])
>>> zscore(a, axis=0)
stats.py:2248: RuntimeWarning: invalid value encountered in true_divide
  return (a - mns) / sstd
array([[        nan, -0.70710678, -0.70710678, -0.70710678],
       [        nan, -0.70710678, -0.70710678, -0.70710678],
       [        nan,  1.41421356,  1.41421356,  1.41421356]])

 どうしてエラーになるかというと、z得点は標準偏差で割るので、標準偏差が0だと0除算エラーが発生するからです。標準偏差0の列が含まれるようなゴミだらけの汚い疎行列をそのまま入れると、これが出来ます。

対策

 どうせ標準偏差0の軸とか要らないので、予め消し飛ばしておく。

>>> a[:,np.std(a, axis=0) != 0]
array([[2, 3, 4],
       [2, 3, 4],
       [3, 4, 5]])
>>> zscore(a[:,np.std(a, axis=0) != 0], axis=0)
array([[-0.70710678, -0.70710678, -0.70710678],
       [-0.70710678, -0.70710678, -0.70710678],
       [ 1.41421356,  1.41421356,  1.41421356]])

 めでたしめでたし。