我有一个Numpy二维数组,其中一列有布尔值,即True
/ False
。我想分别将它转换为整数1
和0
,我该怎么做?
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']]
答案 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(浮点)