2012-09-30 17 views
15

Perché il programma dinumpy.shape fornisce risposte incoerenti - perché?

import numpy as np 

c = np.array([1,2]) 
print(c.shape) 
d = np.array([[1],[2]]).transpose() 
print(d.shape) 

dare

(2,) 
(1,2) 

come la sua uscita? Non dovrebbe essere

(1,2) 
(1,2) 

? Ho ottenuto questo in entrambi python 2.7.3 e python 3.2.3

+4

Altri potrebbero chiedere il contrario, quindi penso che dovresti dire perché ti aspetti più tardi. – hakre

+1

Si potrebbe pensare a MATLAB, ma controllare la differenza tra 'matrice' e' matrice ', in numpy, gli array sono preferibili. – seberg

+1

@hakre Non vedo alcuna differenza (nella vita reale) tra una lista (orizzontale) e una matrice 1 xn, quindi mi aspettavo che la forma dell'array normale fosse 1 xn - e mi aspettavo anche d = [1 , 2] e non [[1, 2]], ma questo ha il suo tipo di logica una volta che vedi cosa sta succedendo. – user1710403

risposta

1

len(c.shape) è la "profondità" della matrice.

Per c, l'array è solo un elenco (un vettore), la profondità è 1.
Per d, l'array è una lista di liste, la profondità è di 2.

Nota:

c.transpose() 
# array([1, 2]) 

che non è d, quindi questo comportamento non è incoerente.

dt = d.transpose() 
# array([[1], 
#  [2]]) 
dt.shape # (2,1) 
14

Quando si richiama l'attributo .shape di un ndarray, si ottiene una tupla con il maggior numero di elementi come le dimensioni del vostro array. La lunghezza, cioè, il numero di righe, è la prima dimensione (shape[0])

  • Si inizia con una matrice: c=np.array([1,2]). Questo è un semplice array 1D, quindi la sua forma sarà una tupla a 1 elemento e shape[0] è il numero di elementi, quindi c.shape = (2,)
  • Considerare c=np.array([[1,2]]). Questo è un array 2D, con 1 riga. La prima e unica riga è [1,2], che ci dà due colonne. Pertanto, c.shape=(1,2) e len(c)=1
  • Considerare c=np.array([[1,],[2,]]). Un altro array 2D, con 2 righe, 1 colonna: c.shape=(2,1) e len(c)=2.
  • Considerare d=np.array([[1,],[2,]]).transpose(): questa matrice è la stessa di np.array([[1,2]]), pertanto la sua forma è (1,2).

altro attributo utile è .size: questo è il numero di elementi in tutte le dimensioni, e si dispone di un array cc.size = np.product(c.shape).

Ulteriori informazioni sulla forma nello documentation.

+1

Non ho davvero un commento utile, ma sento il bisogno di dire ... questo mi infastidisce per qualche ragione ... –

0

transpose non modifica il numero di dimensioni dell'array. Se c.ndim == 1, c.transpose() == c. Prova:

c = np.array([1,2]) 
print c.shape 
print c.T.shape 
c = np.atleast_2d(c) 
print c.shape 
print c.T.shape 
0

Correzione rapida: controlla la proprietà .ndim: se è 2, la proprietà .shape funzionerà come previsto.

Motivo Perché: se la proprietà .ndim è 2, numpy riporta un valore di forma che è in accordo con la convenzione. Se la proprietà .ndim è 1, numpy riporta semplicemente la forma in un modo diverso.

Ulteriori informazioni: quando si passa a np.array un elenco di elenchi, la proprietà .shape accetta le nozioni standard delle dimensioni di una matrice: (righe, colonne).

Se si passa a np.array solo una lista, quindi numpy non pensa di avere una matrice sulle sue mani e segnala la forma in un modo diverso.

La domanda è: il numpy pensa di avere una matrice, o pensa di avere qualcos'altro nelle sue mani.

Problemi correlati