1

この形式で到着するデータがあります。

[
  (1, "000010101001010101011101010101110101", "aaa", ... ),
  (0, "111101010100101010101110101010111010", "bb", ... ),
  (0, "100010110100010101001010101011101010", "ccc", ... ),
  (1, "000010101001010101011101010101110101", "ddd", ... ),
  (1, "110100010101001010101011101010111101", "eeee", ... ),
  ...
]

タプル形式では、次のようになります。

(Y, X, other_info, ... )

一日の終わりに、Y と X を使用して分類子 (例: sklearn.linear_model.logistic.LogisticRegression) をトレーニングする必要があります。

分類子を介して実行できるように、1 と 0 の文字列を np.array のようなものに変換する最も簡単な方法は何ですか? ここには簡単な答えがあるはずですが、/ググることができませんでした。

いくつかのメモ:

  • 私はすでに numpy/pandas/sklearn を使用しているので、これらのライブラリにあるものは何でも公平なゲームです。
  • 私がやっていることの多くでは、other_info 列を DataFrame にまとめておくと便利です
  • 文字列はかなり長い (~20,000 列) ですが、全体のデータ フレームはそれほど高くありません (~500 行)。
4

2 に答える 2

8

あなたは主に1と0の文字列をnumpy配列に変換する方法を求めたので、次のように私の解決策を提供します:

d = '0101010000' * 2000 # create a 20,000 long string of 1s and 0s
d_array = np.fromstring(d, 'int8') - 48 # 48 is ascii 0. ascii 1 is 49

これは、速度の点で@DSM のソリューションよりも優れています。

In [21]: timeit numpy.fromstring(d, dtype='int8') - 48
10000 loops, best of 3: 35.8 us per loop

In [22]: timeit numpy.fromiter(d, dtype='int', count=20000)
100 loops, best of 3: 8.57 ms per loop
于 2012-09-04T10:55:12.960 に答える
2

このようなものはどうですか:

データフレームを作成します。

In [82]: v = [
   ....:     (1, "000010101001010101011101010101110101", "aaa"),
   ....:     (0, "111101010100101010101110101010111010", "bb"),
   ....:     (0, "100010110100010101001010101011101010", "ccc"),
   ....:     (1, "000010101001010101011101010101110101", "ddd"),
   ....:     (1, "110100010101001010101011101010111101", "eeee"),
   ....:     ]

In [83]: 

In [83]: df = pandas.DataFrame(v)

fromiterorを使用arrayして取得できますndarray:

In [84]: d ="000010101001010101011101010101110101"

In [85]: np.fromiter(d, int) # better: np.fromiter(d, int, count=len(d))
Out[85]: 
array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0,
       1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1])

In [86]: np.array(list(d), int)
Out[86]: 
array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0,
       1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1])

これを行うための洗練されたベクトル化された方法があるかもしれませんが、私は明らかなエントリごとの関数を値に適用し、私の一日を続けます:

In [87]: df[1]
Out[87]: 
0    000010101001010101011101010101110101
1    111101010100101010101110101010111010
2    100010110100010101001010101011101010
3    000010101001010101011101010101110101
4    110100010101001010101011101010111101
Name: 1

In [88]: df[1] = df[1].apply(lambda x: np.fromiter(x, int)) # better with count=len(x)

In [89]: df
Out[89]: 
   0                                                  1     2
0  1  [0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1    aaa
1  0  [1 1 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0     bb
2  0  [1 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 0    ccc
3  1  [0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1    ddd
4  1  [1 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1   eeee

In [90]: df[1][0]
Out[90]: 
array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0,
       1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1])
于 2012-09-03T23:59:57.200 に答える