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

python中如何从布尔数组转换为int数组,python,numpy,Python,Numpy,我有一个Numpy二维数组,其中一列有布尔值,即True/False。我想把它分别转换成整数1和0,我该怎么做 例如,我的数据[0::,2]是布尔值,我尝试了 data[0::,2]=int(data[0::,2]) ,但它给了我一个错误: TypeError:只有长度为1的数组才能转换为Python标量 我的前5行数组是: [['0', '3', 'True', '22', '1', '0', '7.25', '0'], ['1', '1', 'False', '38', '1', '0'

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

例如,我的
数据[0::,2]
是布尔值,我尝试了

data[0::,2]=int(data[0::,2])
,但它给了我一个错误:

TypeError:只有长度为1的数组才能转换为Python标量

我的前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']]

好的,将任何数组的类型更改为浮动的最简单方法是:

data.astype(float)

数组的问题是
float('True')
是一个错误,因为
'True'
不能被解析为浮点数。因此,最好的方法是修复数组生成代码,以生成浮点数(或者,至少是具有有效浮点数的字符串),而不是布尔

同时,您可以使用此函数修复阵列:

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)

如果我在原始数据源(即字符串)上执行此操作:

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)
…然后问题就解决了。。您甚至可以将其作为一个单行程序来执行(不过我认为这会生成int,并且可能需要浮点): 数组([[eval(x)表示y中的x]表示y中的y])

…我认为问题在于numpy将数字字符串保留为字符串,并且由于并非所有字符串都是数字,因此无法对整个数组进行类型转换。此外,如果您尝试仅对数组中具有“True”和“False”的部分执行类型转换,那么您实际上并不是在处理布尔值,而是在处理字符串。。我所知道的唯一改变的方法就是做评估声明。。你也可以这样做:

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]

…这样可以避免评估,因为评估本身就不安全。。但这可能无关紧要,因为您可能使用的是可靠的数据源。

使用@kirelagin的想法与
ast.literal\u 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.    ]])
boolarrayvariable.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]])

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


数据[0::,2]=数据[0::,2].astype(int).astype(float)

这不能是二维数组,因为在二维数组中所有元素的类型都相同。可能您有一个结构化数组。请您显示其中的几行及其
dtype
?好的,这些引号应该提示您有一个字符串数组。因此,在numpy中,2D数组的所有元素都必须具有相同的类型。您要么需要,要么干脆放弃numpy,使用普通的Python列表。你为什么需要numpy?你的最终目标是什么?事实上,我正在学习一个关于使用python的机器学习项目的教程,由于我是python新手,我面临这些困难,它要求使用numpy数组。因此,如果你能告诉我如何将整个字符串数组转换为float,那就太好了,因为很明显,它可以转换为float(将true视为1,将fase视为0)。首先,如何生成数据?从文本文件?@akashdepsaluja我已经仔细检查了代码,它对我有效。你能用
数据[:5]
的准确输出更新你的问题吗?问题中的输出就是准确的输出,你还要别的吗?@akashdepsaluja不,这不可能是真的。首先,我在问题中看到的不是
numpy
数组,而是Python列表。在我编辑它之前,它缺少逗号。Python无法输出它。其次,我的代码也适用于Python列表,所以一切都应该很好。将
print(数据[:5])
添加到您的代码中,并发布准确的输出。或者更好的方法是从pprint导入pprint,然后使用
pprint(数据[:5])
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]])