17

True1 つの列にブール値、つまり/を持つ Numpy 2-D 配列がありますFalse1それを整数に変換したいのですが0、どうすればいいですか?

たとえば、私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']]
4

5 に答える 5

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)

..それで問題は解決しました。..ワンライナーとしても実行できます(ただし、これによりintが作成され、おそらくfloatが必要になると思います): numpy.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]

..このようにして、本質的に安全ではない評価を回避します。..しかし、信頼できるデータソースを使用している可能性があるため、それは問題ではないかもしれません.

于 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に変換できます

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

于 2017-08-27T19:50:26.617 に答える