2017-02-26 5 views
2

Ich habe das Ergebnis einiger mit numpy.matrix Typen gemacht BerechnungenSeltsames Verhalten von Matplotlib Plotten numpy.matrix Typen

import numpy as np 
import matplotlib.pyplot as plt 

from mpl_toolkits.mplot3d import Axes3D 

fig = plt.figure() 
ax = Axes3D(fig) 

# [...] 

# Downsampling for plotting 
# type(verts): np.matrix 
# verts.shape: (3, 700000) 

verts = verts_small[:, ::1000] 

ax.plot(verts[0, :], verts[1, :], verts[2, :], 'o') 

Dieses seltsame Verhalten. Plot die Punkte alle in einer Linie.

Wenn statt:

verts = np.array(verts[:, ::1000]) 

der 3D-Plot wie erwartet funktioniert. Ist das ein beabsichtigtes Verhalten oder ist es ein Fehler?

+0

Haben Sie sich die Form von 'verts' nach der' :: 1000' Indizierung angesehen? Wenn Sie mit einem 2D-Array beginnen, müssen Sie sicherstellen, dass Sie die richtige Dimension indizieren. Übe diese Art der Indizierung auf etwas Kleinerem, damit du den Unterschied verstehst. – hpaulj

+0

@hpaulj gab es einen Tippfehler beim ersten Anruf, den ich korrigiert habe. Übrigens ist die Form, die ich nach dem Slicing bekomme, die gleiche für "np.array" und "np.matrix". – SolidSnake

+2

Beachten Sie, dass beim Indexieren einer 'np.matrix' das Ergebnis immer noch 2d ist. Ein 'np.darray' könnte 1d sein (abhängig davon, wie du indexierst). – hpaulj

Antwort

1

Wie hpaulj erwähnt, hier das Problem ist, dass das Ergebnis 2d:

>>> verts = np.zeros((3, 100)) 
>>> verts_m = np.matrix(verts) 
>>> verts[0, :].shape 
(100,) 
>>> verts_m[0, :].shape 
(1, 100) 

Entscheidend ist, dass diese bricht jeden Code, der eine Spalte oder Zeile eines 2D-Arrays iterieren zu können, erwartet:

>>> len(verts) 
100 
>>> len(verts_m) 
1 

Schlimmer noch, verts_m nicht einmal als eine Liste von Listen verhalten:

>>> len(verts[0]) 
1 
>>> len(verts[0][0]) 
1 
>>> len(verts[0][0][0][0][0][0][0][0][0][0]) 
1 

Im Wesentlichen, np.matrix bricht die meisten Regeln über Formen, wenn es um anonyme Operationen kommt. Um sie in matplotlib zu unterstützen, müssten sie entweder diese Regelbrüche absichtlich umgehen oder die Eingaben dazu zwingen, Standard np.array s zu sein.