web-dev-qa-db-fra.com

FutureWarning: L'utilisation d'une séquence non-Tuple pour l'indexation multidimensionnelle est déconseillée, utilisez `arr [Tuple (seq)]` au lieu de `arr [seq]`

J'aimerais ne pas utiliser la séquence non-Tuple pour l'indexation multidimensionnelle afin que le script prenne en charge la version future de Python lorsque cela changera.

Ci-dessous le code que j'utilise pour tracer le graphique:

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())
13
yajant b

Je peux reproduire l'avertissement avec:

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

En remplaçant le : par un slice(None), nous pouvons écrire cette indexation comme suit:

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.])

Ce devrait vraiment être un tuple, plutôt qu'une liste:

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.])

L'avertissement nous indique que le format de la liste était correct, mais qu'il générera à l'avenir une erreur.

Je ne vois rien dans votre code qui fasse ce genre de tranche dans une liste d'indexation.

data from genfromtxt est un tableau structuré, donc l'indexation par nom de champ est normale: data["column_1"]. Il est donc probable que l'avertissement soit généré dans le code plot. Mais nous ne savons pas où. L'avertissement ne donne aucune sorte de trace de pile d'erreur, faites-le?

Donc, sans un exemple de tableau comme data ou un fichier csv comme Example.csv, nous ne pouvons pas reproduire l'avertissement et Dig plus loin.


Pour commencer, je mettrais une sorte de print entre chacune de vos lignes de code. L’objectif est de déterminer quel appel matplotlib génère l’avertissement.

Si par exemple il est produit en 

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

Je pourrais essayer de changer cet appel en

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

ou

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

C'est un peu de devinette sauvage ...

modifier

FutureWarning: l'utilisation d'une séquence non-Tuple pour l'indexation multidimensionnelle est déconseillée, utilisez `arr [Tuple (seq)]`

Ce dernier SO nous aide à identifier une fonction problématique dans le package scipy.stats. Il construit une liste de tranches et l'utilise sans autre conversion en Tuple.

11
hpaulj

J'aurais testé cela avant de poster (enfin, je l'ai testé pour les zones où j'avais le même problème), mais je suppose que cela vous aidera. En utilisant votre première ligne où vous appelez un tracé ci-dessus, utilisez le transtypage de type Tuple comme je l’ai déjà montré et faites de même avec vos autres lignes appelant tracé.

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

Quand j’ai étudié les méthodes d’indexation numpy, l’avertissement me semblait un peu plus logique. Cependant, je ne comprends pas vraiment pourquoi les choses doivent aller de cette façon. 

6
Thom Ives

La mise à jour de Scipy a résolu ce problème dans mon cas. Parce que la classe Scipy.stats était obsolète.

1
RiseofRice