ho chiesto dtype
perché il vostro esempio è sconcertante.
posso fare una serie strutturato con 3 elementi (1d) e 3 campi:
In [1]: A = np.ones((3,), dtype='i,i,i')
In [2]: A
Out[2]:
array([(1, 1, 1), (1, 1, 1), (1, 1, 1)],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
posso accedere un campo per nome (tra parentesi l'aggiunta non cambia le cose)
In [3]: A['f0'].shape
Out[3]: (3,)
ma se accedo 2 campi, ho ancora ottenere un allineamento 1d
In [4]: A[['f0','f1']].shape
Out[4]: (3,)
In [5]: A[['f0','f1']]
Out[5]:
array([(1, 1), (1, 1), (1, 1)],
dtype=[('f0', '<i4'), ('f1', '<i4')])
In realtà quei parentesi in più sono importanti, se io Loo k a valori
In [22]: A['f0']
Out[22]: array([1, 1, 1], dtype=int32)
In [23]: A[['f0']]
Out[23]:
array([(1,), (1,), (1,)],
dtype=[('f0', '<i4')])
Se la matrice è semplice 2d, io ancora non capisco le forme
In [24]: A=np.ones((3,3),int)
In [25]: A[0].shape
Out[25]: (3,)
In [26]: A[[0]].shape
Out[26]: (1, 3)
In [27]: A[[0,1]].shape
Out[27]: (2, 3)
Ma alla domanda di assicurarsi un array è 2d, a prescindere dal fatto che il indicizzazione restituisce 1D o 2, la funzione è fondamentalmente ok
def reshape_to_vect(ar):
if len(ar.shape) == 1:
return ar.reshape(ar.shape[0],1)
return ar
Si potrebbe testare ar.ndim
invece di len(ar.shape)
. Ma in entrambi i casi non è costoso - cioè, il tempo di esecuzione è minimo - nessuna grande operazione di array. reshape
non copia i dati (a meno che le tue falcate siano strane), quindi è solo il costo di creare un nuovo oggetto array con un puntatore dati condiviso.
Consultare il codice per np.atleast_2d
; prova per 0d e 1d. Nel caso 1d restituisce result = ary[newaxis,:]
. Aggiunge prima l'asse extra, più naturale è la posizione numpy
per l'aggiunta di un asse. Lo aggiungi alla fine.
ar.reshape(ar.shape[0],-1)
è un modo intelligente di ignorare il test if
. Nei piccoli test di temporizzazione è più veloce, ma stiamo parlando di microsecondi, l'effetto di un livello di chiamata di funzione.
np.column_stack
è un'altra funzione che crea array di colonne, se necessario. Esso utilizza:
if arr.ndim < 2:
arr = array(arr, copy=False, subok=True, ndmin=2).T
Che cos'è il 'dtype'? Sembra 'strutturato'. – hpaulj
È irrilevante, l'ho usato solo come esempio di come potrei finire con un array 1d o 2d. La mia domanda riguarda come convertire sistematicamente l'array da 1d a 2d in modo sistematico. – DevShark