2013-06-01 14 views
9

Mam tablicę Numpy 2-D, w której jedna kolumna ma wartości Boolean, tj. True/False. Chcę przekonwertować go na liczbę całkowitą odpowiednio 1 i 0, jak mogę to zrobić?Jak przekonwertować z tablicy boolean na int tablicy w python

E.g. moja data[0::,2] jest logiczna, próbowałem

data[0::,2]=int(data[0::,2]) 

, ale to daje mi błąd:

TypeError: only length-1 arrays can be converted to Python scalars

Moje pierwsze 5 rzędów tablicy są:

[['0', '3', 'True', '22', '1', '0', '7.25', '0'], 
['1', '1', 'False', '38', '1', '0', '71.2833', '1'], 
['1', '3', 'False', '26', '0', '0', '7.925', '0'], 
['1', '1', 'False', '35', '1', '0', '53.1', '0'], 
['0', '3', 'True', '35', '0', '0', '8.05', '0']] 
+2

Nie może to być tablica 2D, ponieważ w tablicy 2D wszystkie elementy mają ten sam typ. Prawdopodobnie masz uporządkowaną tablicę. Czy mógłbyś, proszę, pokazać kilka pełnych wierszy od niego i jego 'dtype'? – kirelagin

+1

OK, te cytaty powinny Cię poinformować, że masz tablicę ciągów znaków. Tak więc, znowu w numpy wszystkie elementy tablicy 2D muszą mieć ten sam typ. Potrzebujesz albo [uporządkowanych tablic] (http://docs.scipy.org/doc/numpy/user/basics.rec.html) lub po prostu pozbyć się numpy i używać zwykłych list Pythona. Dlaczego potrzebujesz numpy i jaki jest twój ostateczny cel? – kirelagin

+1

Właściwie postępuję zgodnie z tutorialem na temat projektu uczenie maszynowego, który używa Pythona, a ponieważ jestem nowy dla Pythona napotykam na tę trudność, prosi o numpy array. Byłoby wspaniale, gdybyś mógł mi powiedzieć, jak przekonwertować całą tablicę łańcuchów, aby się uaktywnić, ponieważ jest jasne, że można ją przekształcić na wartość float (traktując jako 1 i fase jako 0). –

Odpowiedz

9

Ok, najprostszym sposób na zmianę typu dowolnej macierzy na pływający:

data.astype(float)

Problem z tablicą jest taki, że float('True') jest błędem, ponieważ 'True' nie można przeanalizować jako liczby zmiennoprzecinkowej. Najlepiej więc naprawić kod generujący tablicę, aby utworzyć floats (lub przynajmniej łańcuchy z poprawnymi literałami float) zamiast boolów.

W międzyczasie można skorzystać z tej funkcji, aby naprawić tablicę:

def boolstr_to_floatstr(v): 
    if v == 'True': 
     return '1' 
    elif v == 'False': 
     return '0' 
    else: 
     return v 

I wreszcie konwertować tablicę tak:

new_data = np.vectorize(boolstr_to_floatstr)(data).astype(float) 
+0

Daje błąd: "nie można przekonwertować napisu na zmiennoprzecinkowe:" –

+0

@AkashdeepSaluja Podwójnie sprawdziłem kod i działa on dla mnie. Czy mógłbyś zaktualizować swoje pytanie dokładnymi danymi wyjściowymi 'data [: 5]'. – kirelagin

+0

Dane wyjściowe w pytaniu to dokładne wyniki, czy chcesz coś innego? –

1

Jeśli mogę to zrobić na swojej surowej źródła danych, czyli ciągi:

data = [['0', '3', 'True', '22', '1', '0', '7.25', '0'], 
     ['1', '1', 'False', '38', '1', '0', '71.2833', '1'], 
     ['1', '3', 'False', '26', '0', '0', '7.925', '0'], 
     ['1', '1', 'False', '35', '1', '0', '53.1', '0'], 
     ['0', '3', 'True', '35', '0', '0', '8.05', '0']] 

data = [[eval(x) for x in y] for y in data] 

..i następnie postępuj że z:

data = [[float(x) for x in y] for y in data] 
# or this if you prefer: 
arr = numpy.array(data) 

.. następnie problem został rozwiązany. ... możesz to zrobić nawet jako jeden liniowiec (myślę, że to powoduje, że ints i prawdopodobnie są potrzebne zmienne): numpy.array ([[eval (x) dla x in y] dla y w danych])

.. Myślę, że problemem jest to, że numpy utrzymuje ciągi liczbowe jako ciągi, a ponieważ nie wszystkie z twoich ciągów są numeryczne, nie możesz dokonać konwersji typu na całej tablicy. Ponadto, jeśli spróbujesz wykonać konwersję typu tylko na częściach tablicy z wartościami "True" i "False", nie działa tak naprawdę z wartościami binarnymi, ale z łańcuchami. ..i jedynymi sposobami, które znam, aby to zmienić, są instrukcje eval. ... dobrze, możesz to również zrobić:

.. w ten sposób unikasz pozorów, które są z natury niepewne. .. ale to nie ma znaczenia, ponieważ możesz używać zaufanego źródła danych.

1

Korzystanie pomysł @ kirelagin jest z ast.literal_eval

>>> import ast 
>>> import numpy as np 
>>> arr = np.array(
     [['0', '3', 'True', '22', '1', '0', '7.25', '0'], 
     ['1', '1', 'False', '38', '1', '0', '71.2833', '1'], 
     ['1', '3', 'False', '26', '0', '0', '7.925', '0'], 
     ['1', '1', 'False', '35', '1', '0', '53.1', '0'], 
     ['0', '3', 'True', '35', '0', '0', '8.05', '0']]) 
>>> np.vectorize(ast.literal_eval, otypes=[np.float])(arr) 
array([[ 0. , 3. , 1. , 22. , 1. , 0. , 
      7.25 , 0. ], 
     [ 1. , 1. , 0. , 38. , 1. , 0. , 
     71.2833, 1. ], 
     [ 1. , 3. , 0. , 26. , 0. , 0. , 
      7.925 , 0. ], 
     [ 1. , 1. , 0. , 35. , 1. , 0. , 
     53.1 , 0. ], 
     [ 0. , 3. , 1. , 35. , 0. , 0. , 
      8.05 , 0. ]]) 
3

boolarrayvariable.astype (int) działa:

data = np.random.normal(0,1,(1,5)) 
threshold = 0 
test1 = (data>threshold) 
test2 = test1.astype(int) 

wyjściowych:

data = array([[ 1.766, -1.765, 2.576, -1.469, 1.69]]) 
test1 = array([[ True, False, True, False, True]], dtype=bool) 
test2 = array([[1, 0, 1, 0, 1]]) 
0

Stare Q ale odniesienie - bool mogą być przekształcone do int int z pływakiem

danych [0 ::, 2] = dane [0 ::, 2] .astype (int) .astype (float)

Powiązane problemy