web-dev-qa-db-ja.com

FutureWarning:多次元のインデックス付けにタプル以外のシーケンスを使用することは推奨されません。

多次元のインデックス作成にタプル以外のシーケンスを使用したくないので、この変更時にスクリプトがPythonの将来のリリースをサポートするようにします。

以下は、グラフのプロットに使用しているコードです。

data = np.genfromtxt(Example.csv,delimiter=',', dtype=None, names=True, 
    converters={0: str2date})

p1, = Host.plot(data["column_1"], data["column_2"], "b-", label="column_2")
p2, = par1.plot(data["column_1"], data['column_3'], "r-", label="column_3")
p3, = par2.plot(data["column_1"], data["column_4"], "g-", label="column_4")

Host.set_xlim([data["column_1"][0], data["column_1"][-1]])
Host.set_ylim(data["column_2"].min(), data["column_2"].max())
par1.set_ylim(data["column_3"].min(), data["column_3"].max())
par2.set_ylim(data["column_4"].min(), data["column_4"].max())
21
yajant b

警告を再現できます:

In [313]: x = np.zeros((4,2))
In [315]: x[:,1]
Out[315]: array([0., 0., 0., 0.])

:slice(None)に置き換えることにより、このインデックスを次のように書くことができます。

In [316]: x[[slice(None),1]]
/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[316]: array([0., 0., 0., 0.])

リストではなく、タプルである必要があります。

In [317]: x[(slice(None),1)]
Out[317]: array([0., 0., 0., 0.])
In [318]: x[Tuple([slice(None),1])]
Out[318]: array([0., 0., 0., 0.])

この警告は、リスト形式は以前は問題ありませんでしたが、将来エラーが発生することを示しています。

リストのインデックスにこの種のスライスを行うコードは見当たりません。

data from genfromtxtは構造化配列であるため、フィールド名によるインデックス付けは通常data["column_1"]です。そのため、plotコード内で警告が生成される可能性があります。しかし、私たちはどこについての手掛かりを持っていません。この警告は、エラースタックトレースを一切提供しません。

したがって、dataのようなサンプル配列、またはExample.csvのようなcsvファイルがないと、警告を再現できず、さらに掘り下げます。


最初に、各コード行の間にある種のprintを挿入します。目標は、どのmatplotlib呼び出しが警告を生成しているかを特定することです。

たとえば、

Host.set_xlim([data["column_1"][0], data["column_1"][-1]])

私はその呼び出しを変更しようとするかもしれません

Host.set_xlim((data["column_1"][0], data["column_1"][-1]))

または

Host.set_xlim(data["column_1"][0], data["column_1"][-1])

それはちょっとした推測です...

編集する

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

この最新のSOは、scipy.statsパッケージ内の問題関数を識別するのに役立ちます。スライスのリストを作成し、さらにタプルに変換せずに使用します。

11
hpaulj

私の場合、Scipyを更新するとこの問題が修正されました。原因Scipy.statsクラスは廃止されました。

7
RiseofRice

投稿する前にこれをテストしていました(まあ、同じ問題を抱えていた領域でテストしました)が、これはあなたの役に立つと思います。上記のプロットを呼び出す最初の行を使用して、私が示したようにタプル型キャストを使用し、プロットを呼び出す他の行にも同じことを行います。

p1, = Host.plot(Tuple(data["column_1"]), 
                Tuple(data["column_2"]), 
                "b-", label="column_2")

Numpyのインデックス作成方法を調べたとき、警告はもう少し意味がありました。しかし、私は物事がこのように進む必要がある理由を本当に理解していません。

6
Thom Ives