1

0 から 9 までの 60,000 個の数字の配列があります。

In [1]: trainY
Out[1]: 
array([[5],
       [0],
       [4],
       ..., 
       [5],
       [6],
       [8]], dtype=int8)

そして、trainY以下のように、各要素を 10 要素ベクトルに変換する関数があります。

0 -> [1,0,0,0,0,0,0,0,0,0]
1 -> [0,1,0,0,0,0,0,0,0,0]
2 -> [0,0,1,0,0,0,0,0,0,0]
3 -> [0,0,0,1,0,0,0,0,0,0]
...
9 -> [0,0,0,0,0,0,0,0,0,1]

関数:

def transform_y(y):
    new_y = np.zeros(10)
    new_y[y] = 1
    return new_y

私のコードは、一度に 1 つの要素しか機能しません。trainY配列を一度に変換する最良の方法は何ですか(for ループ以外)? 使用する必要がありますmapか? 誰かが関数を書き直してベクトル化する方法を教えてもらえますか?

ありがとうございました。

4

2 に答える 2

4

対角線に沿って 2 次元配列を作成し、入力配列に基づいて適切な行を抽出することで、コード速度を大幅に向上させることができます。

a = array([[5],
           [0],
           [4],
           ..., 
           [5],
           [6],
           [8]], dtype=int8)

new_y = np.eye(a.max()+1)[a.ravel()]

さらに高速な解決策は、出力配列をゼロで作成し、からのインデックスに従って入力することaです。

new_y = np.zeros((a.shape[0], a.max()+1))
new_y[np.indices(a.ravel().shape)[0], a.ravel()] = 1.
于 2013-11-07T08:24:21.003 に答える
3

vectorizeデコレータを使用できます

@np.vectorize
def transform_y(y):
    new_y = np.zeros(10)
    new_y[y] = 1
    return new_y

http://telliott99.blogspot.ch/2010/03/vectorize-in-numpy.htmlを参照してください。

于 2013-11-07T08:04:44.373 に答える