Matrice numpy à tableau


150

J'utilise numpy. J'ai une matrice avec 1 colonne et N lignes et je veux obtenir un tableau à partir de N éléments.

Par exemple, si je l'ai M = matrix([[1], [2], [3], [4]]), je veux obtenir A = array([1,2,3,4]).

Pour y parvenir, j'utilise A = np.array(M.T)[0]. Quelqu'un connaît-il un moyen plus élégant d'obtenir le même résultat?

Merci!


Réponses:


192

Si vous souhaitez quelque chose d'un peu plus lisible, vous pouvez le faire:

A = np.squeeze(np.asarray(M))

De manière équivalente, vous pouvez également faire:, A = np.asarray(M).reshape(-1)mais c'est un peu moins facile à lire.


9
Petite diatribe de ma part ... pourquoi numpy a-t-il des tableaux et des matrices comme entités séparées. Il est tellement impythonique à mon humble avis. Merci pour cette astuce @Joe.
Naijaba

6
@Naijaba - Pour ce que ça vaut, la classe de matrice est effectivement (mais pas formellement) dépréciée. C'est là principalement à des fins historiques. La suppression numpy.matrixest un peu une question litigieuse, mais les développeurs numpy sont tout à fait d'accord avec vous pour dire qu'avoir les deux est impythonique et ennuyeux pour toute une série de raisons. Cependant, la quantité de code ancien et non maintenu "dans la nature" qui utilise matrixrend difficile sa suppression complète.
Joe Kington

1
Sans oublier que la vraie multiplication matricielle n'a été ajoutée que pour les tableaux dans Numpy 1.10, et est fondamentalement toujours en version bêta. Cela signifie que beaucoup de gens (y compris moi-même) doivent encore utiliser des matrices au lieu de tableaux pour faire ce que nous voulons. docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Georges Oates Larsen

1
Les matrices clairsemées sont fondamentales pour un apprentissage automatique efficace en mémoire (par exemple sklearn). En fait, il existe différents sparse matrixtypes dans scipy, qui permettent un accès efficace via des lignes ou des colonnes. J'imagine que cela peut être un problème pour fusionner les concepts de matrice et de tableau. Cela dit, je me demande si un sparse arraytype pourrait également être introduit et s'il est prévu de le faire. Des indices?
pms

Je pense que .flatten () fonctionne aussi bien que .squeeze (), tant que vous voulez un tableau 1D à la fin.
wordsforthewise

122

6
Je pense que cette réponse est meilleure que la réponse acceptée, en
termes de

M.A1 est génial, même implémentation que "ravel" et "flatten" et dans ce cas ne provoque aucune copie de données A reste donc lié à M ce qui peut provoquer des surprises si A et / ou M sont mutables. M.flat véritable alternative retournant le générateur de "flatiter" (sémantique en lecture seule) np.squeeze (M) # donne une vue supprimant les dimensions de taille 1, ok ici aussi mais pas garanti d'être 1-d pour le général M np.reshape ( M, -1) # est généralement une vue en fonction de la compatibilité des formes, ce "-1" est un moyen détourné de faire A1 / ravel / aplatir
jayprich

13
A, = np.array(M.T)

dépend de ce que vous entendez par élégance je suppose mais c'est ce que je ferais


11

Vous pouvez essayer la variante suivante:

result=np.array(M).flatten()

7
np.array(M).ravel()

Si vous aimez la vitesse; Mais si vous vous souciez de la mémoire:

np.asarray(M).ravel()

Cela améliorerait la qualité de votre réponse si vous
expliquiez

6

Ou vous pouvez essayer d'éviter certains temps avec

A = M.view(np.ndarray)
A.shape = -1

2

Première, Mv = numpy.asarray(M.T) ce qui vous donne un tableau 4x1 mais 2D.

Ensuite, jouez A = Mv[0,:], ce qui vous donne ce que vous voulez. Vous pouvez les mettre ensemble, comme numpy.asarray(M.T)[0,:].



0

ravel () et aplatir () fonctions de numpy sont deux techniques que je voudrais essayer ici. Je voudrais ajouter aux messages de Joe , Siraj , Bubble et Kevad .

Effilochage:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

Aplatir:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()est plus rapide , car il s'agit d'une fonction de niveau bibliothèque qui ne fait aucune copie du tableau. Cependant, tout changement dans le tableau A sera reporté sur le tableau d'origine M si vous utiliseznumpy.ravel() .

numpy.flatten() est plus lent que numpy.ravel() . Mais si vous utilisez numpy.flatten()pour créer A, des changements dans A ne sera pas reporté sur le M tableau original .

numpy.squeeze()et M.reshape(-1)sont plus lents que numpy.flatten()et numpy.ravel().

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.