如何在python中从布尔数组转换为int数组

时间:2013-06-01 06:55:19

标签: python numpy

我有一个Numpy二维数组,其中一列有布尔值,即True / False。我想分别将它转换为整数10,我该怎么做?

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

5 个答案:

答案 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)

答案 1 :(得分:7)

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]])

答案 2 :(得分: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(数据中y的[[eval(x)for x in y])

..我认为问题是numpy将数字字符串保持为字符串,并且因为并非所有字符串都是数字字符串,所以不能对整个数组进行类型转换。此外,如果您尝试仅使用“True”和“False”对数组的部分进行类型转换,那么您实际上并不是在使用布尔值,而是使用字符串。 ..我知道改变的唯一方法就是做eval语句。 ..你也可以这样做:

booltext_int = {'True': 1, 'False': 2}
clean = [[float(x) if x[-1].isdigit() else booltext_int[x]
          for x in y] for y in data]

..这样你就可以避免本身不安全的逃避。 ..但这可能无关紧要,因为您可能正在使用可信数据源。

答案 3 :(得分: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.    ]])

答案 4 :(得分:0)

旧Q但是,作为参考 - bool可以转换为int,int可以转换为float

数据[0 ::,2] = DATA [0 ::,2] .astype(INT).astype(浮点)