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())
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 ...
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.
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.
Die Aktualisierung von Scipy hat dieses Problem in meinem Fall behoben. Die Scipy.stats-Klasse wurde nicht mehr unterstützt.