2015-09-16 12 views
5

Come si converte un numpy dal tipo 'float64' al tipo 'float'? In particolare, come faccio a convertire un'intera array con dtype'float64' avere dtype'float'? È possibile? La risposta per gli scalari nella domanda duplicata sopra descritta non risolve la mia domanda.Come convertire un array numpy da 'float64' a 'float'

Considerate questo:

>>> type(my_array[0]) 
<type 'numpy.float64'> 

>>> # Let me try to convert this to 'float': 
>>> new_array = my_array.astype(float) 
>>> type(new_array[0]) 
<type 'numpy.float64'> 

>>> # No luck. What about this: 
>>> new_array = my_array.astype('float') 
>>> type(new_array[0]) 
<type 'numpy.float64'> 

>>> # OK, last try: 
>>> type(np.inf) 
<type 'float'> 
>>> # Yeah, that's what I want. 
>>> new_array = my_array.astype(type(np.inf)) 
>>> type(new_array[0]) 
<type 'numpy.float64'> 

Se non siete sicuri perché potrei voler fare questo, vedere this question e le sue risposte.

+2

quanto ne sappia '' float' e float64' sono equivalenti a NumPy. – farenorth

+0

@farenorth suppongo che non abbiate fatto clic sulla domanda collegata? – dbliss

+2

possibile duplicato di [Conversione di dtypes numpy in tipi nativi di python] (http://stackoverflow.com/questions/9452775/converting-numpy-dtypes-to-native-python-types) – tzaman

risposta

3

è possibile creare un tipo anonimo float come questo

>>> new_array = my_array.astype(type('float', (float,), {})) 
>>> type(new_array[0]) 
<type 'float'> 
6

Sì, in realtà quando si utilizza lo standard float di Python per specificare il tipo di dtype per un array, numpy lo converte in float64. Come indicato nel documentation -

Note that, above, we use the Python float object as a dtype. NumPy knows that int refers to np.int_ , bool means np.bool_ , that float is np.float_ and complex is np.complex_. The other data-types do not have Python equivalents.

E -

float_ - Shorthand for float64.

Questo è il motivo per cui, anche se si utilizza float per convertire l'intero array di galleggiare, si usa ancora np.float64.

Secondo il requisito dall'altro questione, la soluzione migliore sarebbe convertono al normale oggetto galleggiante dopo aver preso ogni valore scalare come -

float(new_array[0]) 

Una soluzione che ho potuto pensare è creare una sottoclasse per float e usa quella per il casting (anche se a me sembra pessima). Ma preferirei la soluzione precedente su questo se possibile. Esempio -

In [20]: import numpy as np 

In [21]: na = np.array([1., 2., 3.]) 

In [22]: na = np.array([1., 2., 3., np.inf, np.inf]) 

In [23]: type(na[-1]) 
Out[23]: numpy.float64 

In [24]: na[-1] - na[-2] 
C:\Anaconda3\Scripts\ipython-script.py:1: RuntimeWarning: invalid value encountered in double_scalars 
    if __name__ == '__main__': 
Out[24]: nan 

In [25]: class x(float): 
    ....:  pass 
    ....: 

In [26]: na_new = na.astype(x) 


In [28]: type(na_new[-1]) 
Out[28]: float       #No idea why its showing float, I would have thought it would show '__main__.x' . 

In [29]: na_new[-1] - na_new[-2] 
Out[29]: nan 

In [30]: na_new 
Out[30]: array([1.0, 2.0, 3.0, inf, inf], dtype=object) 
+1

risposta intelligente, grazie. Detto questo, penso che la migliore risposta - almeno per i miei scopi - è ignorare l'avvertenza specifica che sto ottenendo con 'float64's usando' np.errstate' - vedere i commenti sopra. – dbliss

+0

Posso rispondere ad alcuni di quelli. Numpy memorizza tutto ciò che non può trovare un dtype adatto come "oggetto", che è un oggetto Python. Nel caso della tua classe X, non può vedere il float attraverso l'ereditarietà della classe, quindi sceglie l'oggetto. Poiché il tipo dei valori in na_new sono tutti float, ma il dtype è object, significa che tutto è archiviato usando un tipo Pythonic piuttosto che il numpy float64. È tuttavia possibile eseguire operazioni matematiche sui tipi di oggetto, che offrono alcuni vantaggi. –