it-swarm.com.de

FutureWarning: Die Verwendung einer Nicht-Tuple-Sequenz für die mehrdimensionale Indizierung ist veraltet. Verwenden Sie `arr [Tuple (seq)]` statt `arr [seq]`

Ich möchte die Nicht-Tuple-Sequenz nicht für die multidimensionale Indexierung verwenden, damit das Skript die zukünftige Version von Python unterstützt, wenn sich dies ändert.

Unten ist der Code, den ich zum Zeichnen des Diagramms verwende:

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

Ich kann die Warnung reproduzieren mit:

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

Durch Ersetzen von : durch eine slice(None) können wir diese Indizierung schreiben als:

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

Es sollte wirklich ein Tuple sein und keine 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.])

Die Warnung sagt uns, dass das Listenformat früher in Ordnung war, aber zukünftig einen Fehler erzeugen wird.

Ich sehe nichts in Ihrem Code, der diese Art von Slice in einer Listenindexierung durchführt.

data von genfromtxt ist ein strukturiertes Array, daher ist die Indizierung nach Feldnamen normal: data["column_1"]. Es ist daher wahrscheinlich, dass die Warnung im Code plot generiert wird. Aber wir haben keine Ahnung wo. Die Warnung gibt keine Art von Fehlerstack-Trace aus, oder?

Ohne ein Beispiel-Array wie data oder eine CSV-Datei wie Example.csv können wir die Warnung nicht reproduzieren und Dig nicht weiter.


Zunächst würde ich eine Art von print zwischen jede Ihrer Codezeilen setzen. Ziel ist es, festzulegen, welcher matplotlib-Aufruf die Warnung ausgibt.

Wenn es zum Beispiel in produziert wird 

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

Ich könnte versuchen, diesen Anruf zu ändern

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

oder

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

Das ist eine wilde Vermutung ...

bearbeiten

FutureWarning: Die Verwendung einer Nicht-Tupel-Sequenz für die mehrdimensionale Indizierung ist veraltet. Verwenden Sie `arr [Tuple (seq)]` .

Diese neueste SO hilft uns, eine Problemfunktion im scipy.stats-Paket zu identifizieren. Es erstellt eine Liste von Slices und verwendet sie ohne weitere Konvertierung in Tuple.

11
hpaulj

Ich hätte dies vor dem Posting getestet (naja, ich habe es für Bereiche getestet, in denen ich das gleiche Problem hatte), aber ich vermute, dass dies Ihnen helfen wird. Verwenden Sie in der ersten Zeile, in der Sie oben eine Zeichnung aufrufen, Tupel-Typ-Casting, wie ich es gezeigt habe, und machen Sie dasselbe mit Ihrer anderen Linien, die die Zeichnung aufruft.

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

Wenn ich die numpy-Indizierungsmethoden studierte, machte die Warnung etwas mehr Sinn. Ich verstehe jedoch nicht, warum es so gehen muss. 

6
Thom Ives

Die Aktualisierung von Scipy hat dieses Problem in meinem Fall behoben. Die Scipy.stats-Klasse wurde nicht mehr unterstützt.

1
RiseofRice