web-dev-qa-db-ja.com

FutureWarning:多次元のインデックス作成に非タプルシーケンスを使用することは、 `arr [Tuple(seq)]`を使用することは推奨されません

S/Oを検索しましたが、これに対する答えが見つかりませんでした。

シーボーンを使用して分布プロットをプロットしようとすると、将来の警告が表示されます。ここで何が問題になるのだろうと思っていました。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
% matplotlib inline
from sklearn import datasets

iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['class'] = iris.target
df['species'] = df['class'].map({idx:s for idx, s in enumerate(iris.target_names)})


fig, ((ax1,ax2),(ax3,ax4))= plt.subplots(2,2, figsize =(13,9))
sns.distplot(a = df.iloc[:,0], ax=ax1)
sns.distplot(a = df.iloc[:,1], ax=ax2)
sns.distplot(a = df.iloc[:,2], ax=ax3)
sns.distplot(a = df.iloc[:,3], ax=ax4)
plt.show()

これは警告です:

C:\ProgramData\Anaconda3\lib\site-packages\scipy\stats\stats.py:1713:
FutureWarning: Using a non-Tuple sequence for multidimensional indexing is deprecated; 
use `arr[Tuple(seq)]` instead of `arr[seq]`. 
In the future this will be interpreted as an array index, `arr[np.array(seq)]`,
which will result either in an error or a different result.
return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval

助けがありますか?上記のコードを実行できます。警告が表示されます。

パンダ:0.23.4、seaborn:0.9.0、matplotlib:2.2.3、scipy:1.1.0、numpy:1.15.0'

19
user_6396

より完全なトレースバックはいいでしょう。私の推測では、seaborn.distplotは何かを計算するためにscipy.statsを使用しています。エラーは

def _compute_qth_percentile(sorted, per, interpolation_method, axis):
    ....
    indexer = [slice(None)] * sorted.ndim
    ...
    indexer[axis] = slice(i, i + 2)
    ...
    return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval

したがって、この最後の行では、リストindexerを使用してsortedをスライスしています。

In [81]: x = np.arange(12).reshape(3,4)
In [83]: indexer = [slice(None), slice(None,2)]
In [84]: x[indexer]
/usr/local/bin/ipython3:1: FutureWarning: Using a non-Tuple sequence for multidimensional indexing is deprecated; use `arr[Tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  #!/usr/bin/python3
Out[84]: 
array([[0, 1],
       [4, 5],
       [8, 9]])
In [85]: x[Tuple(indexer)]
Out[85]: 
array([[0, 1],
       [4, 5],
       [8, 9]])

スライスのリストを使用することはできますが、将来的には減価償却する計画です。複数のディメンションを含むインデックスはタプルであると想定されています。コンテキストでのリストの使用は、廃止される古いスタイルです。

したがって、scipy開発者はこれを修正する必要があります。これはエンドユーザーが対処しなければならないものではありません。しかし今のところ、futurewarningについて心配しないでください。計算やプロットには影響しません。将来の警告を抑制する方法がありますが、私はそれを手元で知りません。

FutureWarning:多次元インデックス付けに非タプルシーケンスを使用することは推奨されません。`arr[seq] ` の代わりに` arr [Tuple(seq)] `を使用

9
hpaulj

python>=3.7の場合、scipy>=1.2をアップグレードする必要があります。

20
NetworkMeister

私はseaborn.regplotを実行していましたが、NetworkMeisterが提案したscipy 1.2をアップグレードすることで警告を取り除きました。

pip install --upgrade scipy --user

他のシーボーンプロットで警告が表示される場合は、事前に以下を実行できます。これはJupyter Notebookで役立ちます。なぜなら、たとえあなたのプロットが素晴らしい場合でも、警告のようなものはレポートを悪く見せてしまうからです。

import warnings
warnings.filterwarnings("ignore")
3
Sarah

私は同じ警告に出くわしました。 scipy、pandas、numpyを更新しました。 seaborn.pairplotをkdeで使用すると、その下でseaborn.kdeplotが使用されます。

警告を取り除きたい場合は、警告ライブラリを使用できます。例:

import warnings

with warnings.catch_warnings():

    your_code_block
2
Andrés Rojas