python中如何从布尔数组转换为int数组
我有一个Numpy二维数组,其中一列有布尔值,即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'
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]])