2015-09-16 20 views
5

Jak przekonwertować numpyarray z typu 'float64' na typ 'float'? W szczególności, w jaki sposób mogę przekonwertować cały array z dtype'float64' mieć dtype'float'? czy to możliwe? Odpowiedź na pytanie dla skalarów w powyższym zadaniu, które ma być duplikatem, nie zawiera mojego pytania.Jak przekonwertować tablicę numpy z 'float64' na 'float'

Rozważ to:

>>> 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'> 

Jeśli nie jesteś pewien, dlaczego może chcę to zrobić, zobacz this question i jego odpowiedzi.

+2

AFAIK '' float64' float' i są równoważne w numpy. – farenorth

+0

@farenorth Zgaduję, że nie kliknąłeś na powiązane pytanie? – dbliss

+2

możliwy duplikat [Przekształcanie numpy dtypes w natywne typy pytonów] (http://stackoverflow.com/questions/9452775/converting-numpy-dtypes-to-native-python- typeses) – tzaman

Odpowiedz

3

Można utworzyć typ anonimowy float jak ten

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

Tak, w rzeczywistości, gdy używasz natywnego języka Python float do określenia typu dla tablicy, numpy konwertuje go na float64. Jak podano w 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.

oraz -

float_ - Shorthand for float64.

Dlatego mimo korzystania float przekonwertować całą tablicę float, to nadal korzysta np.float64.

Zgodnie z wymogiem z innej kwestii, najlepszym rozwiązaniem będzie konwersja do normalnego obiektu pływaka po wykonaniu każdej wartości skalarne jak -

float(new_array[0]) 

Rozwiązanie, które mogę myśleć jest stworzenie podklasa dla float i użyj jej do rzutowania (choć dla mnie wygląda źle). Ale wolałbym wcześniejsze rozwiązanie tego problemu, jeśli to możliwe. Przykład -

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

sprytna odpowiedź, dzięki. powiedział, myślę, że najlepszą odpowiedzią - przynajmniej dla moich celów - jest zignorowanie ostrzeżenia, które otrzymuję za pomocą 'float64's używając' np.errstate' - patrz komentarze powyżej. – dbliss

+0

Mogę odpowiedzieć na kilka z nich. Numpy przechowuje wszystko, czego nie może znaleźć odpowiedniego dtype jako "obiekt", który jest obiektem Pythona. W przypadku twojej klasy X, nie może zobaczyć float poprzez dziedziczenie klasy, więc wybiera obiekt. Ponieważ typ wartości w na_new są wszystkie zmiennoprzecinkowe, ale dtype jest obiektem, oznacza to, że wszystko jest przechowywane za pomocą typu Pythoniego zamiast numpy float64. Można jednak wykonywać matematykę na obiektach dtypes, co ma pewne zalety. –