17

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

例如 mydata[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']]
4

5 回答 5

18

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

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)
于 2013-06-01T07:17:23.757 回答
14

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]])
于 2015-08-07T14:56:16.343 回答
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)

..那么问题就解决了。..您甚至可以将其作为单行来执行(不过,我认为这会产生整数,并且可能需要浮点数):n​​umpy.array([[eval(x) for x in y] for y in data])

..我认为问题在于 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]

..这样你就可以避免 evals,这本质上是不安全的。..但这可能无关紧要,因为您可能使用的是受信任的数据源。

于 2013-06-01T07:28:03.607 回答
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.    ]])
于 2013-06-01T07:28:20.740 回答
0

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

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

于 2017-08-27T19:50:26.617 回答