2 votes

Comportement étrange des types de tracé Matplotlib numpy.matrix

J'ai le résultat de quelques calculs effectués avec des types numpy.matrix

import numpy as np
import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

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

# [...]

# Réduction pour le tracé
# type(verts):  np.matrix
# verts.shape:  (3, 700000)

verts = verts_small[:, ::1000]

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

Cela a un comportement étrange. Trace les points tous en ligne.

Si au lieu de cela:

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

le tracé 3D fonctionne comme prévu. Est-ce un comportement voulu ou est-ce un bug?

1voto

Eric Points 36290

Comme le mentionne hpaulj, le problème ici est que le résultat est 2d:

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

Essentiellement, cela casse tout code qui s'attend à pouvoir itérer sur une colonne ou une ligne d'un tableau 2d :

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

Pire encore, verts_m ne se comporte même pas comme une liste de listes:

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

En essence, np.matrix enfreint la plupart des règles concernant les formes lorsqu'il s'agit des opérations numpy. Pour le supporter dans matplotlib, ils devraient soit délibérément contourner ces violations de règles, soit forcer les entrées à être des np.array standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X