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])
Suona come un insetto di NumPy, forse. –
È 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
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! –