2015-03-13 14 views
6

Ho una matrice numpy che voglio convertire da un oggetto a complesso. Se lo prendo array come DTYPE stringa e convertirla, non c'è nessun problema:Conversione di un array numpy di oggetti dtype nel complesso dtype

In[22]: bane 
Out[22]: array(['1.000027337501943-7.331085223659654E-6j', 
     '1.0023086995640738-1.8228368353755985E-4j', 
     '-0.017014515914781394-0.2820013864855318j'], 
     dtype='|S41') 

In [23]: bane.astype(dtype=complex) 
Out[23]: 
array([ 1.00002734 -7.33108522e-06j, 1.00230870 -1.82283684e-04j, 
     -0.01701452 -2.82001386e-01j]) 

Ma quando è DTYPE oggetto e cerco di convertirlo, ottengo un errore che è necessario un galleggiante. Perchè è questo?

In [24]: bane.astype(dtype=object) 
Out[24]: 
array(['1.000027337501943-7.331085223659654E-6j', 
     '1.0023086995640738-1.8228368353755985E-4j', 
     '-0.017014515914781394-0.2820013864855318j'], dtype=object) 

In [25]: _.astype(dtype=complex) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-25-f5d89c8cc46c> in <module>() 
----> 1 _.astype(dtype=complex) 

TypeError: a float is required  

Per convertirlo, io uso due chiamate al metodo astype che sembra goffo:

bane_obj 
Out[27]: 
array(['1.000027337501943-7.331085223659654E-6j', 
     '1.0023086995640738-1.8228368353755985E-4j', 
     '-0.017014515914781394-0.2820013864855318j'], dtype=object) 

In [28]: bane_obj.astype(dtype=str).astype(dtype=complex) 
Out[28]: 
array([ 1.00002734 -7.33108522e-06j, 1.00230870 -1.82283684e-04j, 
     -0.01701452 -2.82001386e-01j]) 
+0

Suona come un insetto di NumPy, forse. –

+0

È difficile dire dove si trova la conversione nel codice 'numpy'. La conversione da stringa a complessa ha probabilmente funzionato per un lungo periodo, mentre lo sviluppo di tipi di oggetto è più recente e in corso. Cosa sta generando questo tipo di array di oggetti? – hpaulj

+4

Un array di 'dtype = np.object' potrebbe contenere letteralmente * qualsiasi * tipo di oggetto Python, quindi penso che sia comprensibile che gli sviluppatori di numpy non si siano preoccupati di implementare ogni possibile regola di conversione del tipo qui. Concatenare un '.astype (np.str) .astype (np.complex)' sembra in effetti una soluzione abbastanza ragionevole per quello che deve essere un caso d'uso molto raro. La vera domanda nella mia mente è perché tu abbia a che fare con un array 'np.object' contenente numeri complessi in formato stringa, in primo luogo! –

risposta

0

penso che si potrebbe desiderare di fare quanto segue, a seconda di ciò che è dentro il tipo oggetto e se non c'è imbottitura di cui preoccuparsi:

bane.view(np.complex64) or 
bane.view(np.complex128) 

Tuttavia, se questo non funziona, che non ha fatto per qualche piccolo esempio tuple ho provato, quanto segue lavorato:

bane.astype(np.float).view(np.complex64) 

Considerare l'utilizzo di strutture numpy anziché di oggetti per il dtype di base, è possibile avere un tempo più semplice.

Problemi correlati