2013-06-01 56 views
9

我有一個Numpy二維數組,其中一列有布爾值,即True/False。我想分別將它轉換爲整數10,我該怎麼做?如何從布爾值數組轉換爲int數組在Python中

E.g.我data[0::,2]是布爾,我試過

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

,但它給我的錯誤:

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

我的第5行排列的是:

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

這不能是2D數組,因爲在2D數組中,所有元素都具有相同的類型。可能你有一個結構化數組。請問你能從它和它的'dtype'中顯示幾行完整的行嗎? – kirelagin

+1

好吧,那些引號應該暗示你有一串字符串。因此,再次,在numpy中,2D陣列的所有元素都必須具有相同的類型。你或者需要[結構化數組](http://docs.scipy.org/doc/numpy/user/basics.rec.html)或者只是擺脫numpy並使用普通的Python列表。你爲什麼需要大塊頭,你最終的目標是什麼? – kirelagin

+1

其實我正在學習一個關於使用python的機器學習項目的教程,由於我是python的新手,我正面臨着這些困難,它要求使用numpy數組。所以,如果你能告訴我如何將整個字符串數組轉換爲浮點數,那很好,因爲很明顯,它可以轉換爲浮點數(將true設爲1,fase設爲0)。 –

回答

9

好,最簡單的將任何數組的類型更改爲float的方法是:

data.astype(float)

與您的陣列的問題是,float('True')是一個錯誤,因爲'True'不能被解析爲浮點數。所以,最好的辦法是修復你的數組生成代碼,以產生浮點數(或者至少帶有有效浮點數的字符串)而不是bools。

在此期間,你可以用這個功能來修復您的數組:

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

最後您將您的數組是這樣的:

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

它給錯誤:「無法將字符串轉換爲float:」 –

+0

@AkashdeepSaluja我已經仔細檢查了代碼,它對我有用。你能否用'data [:5]'的確切輸出來更新你的問題。 – kirelagin

+0

問題中的輸出是確切的輸出,你想要別的東西嗎? –

1

如果我這樣做,你的原始數據源,這是一個字符串:

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] 

..和然後請遵照:

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

..然後問題解決了。 ..你甚至可以做它作爲一個單線(我認爲這使得整數,但是,浮動可能需要): numpy.array([[eval(x)for x in y] for y in data])

..我認爲問題在於numpy會將數字字符串保留爲字符串,並且由於並非所有字符串都是數字,所以無法對整個數組執行類型轉換。另外,如果您嘗試僅在數組的部分使用「True」和「False」進行類型轉換,則您並不真正使用布爾值,而是使用字符串。 ..而我知道的唯一改變方法就是做eval語句。 ..嗯,你也可以這樣做:

..這種方式你可以避免evals,這本質上是不安全的。 ..但這可能無關緊要,因爲您可能正在使用受信任的數據源。

1

使用@ kirelagin的想法與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)的工作原理:

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

輸出:

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

舊Q但是,以供參考 - 一個布爾值可以被轉換爲一個int和int爲float

數據[0 ::,2] = data [0 ::,2] .astype(int).astype(float)