50

入力がゼロの場合、次のような配列を作成します。

[1,0,0,0,0,0,0,0,0,0]

入力が 5 の場合:

[0,0,0,0,0,1,0,0,0,0]

上記について、私は次のように書きました。

np.put(np.zeros(10),5,1)

しかし、うまくいきませんでした。

これを1行で実装できる方法はありますか?

4

9 に答える 9

10

何かのようなもの :

np.array([int(i == 5) for i in range(10)])

トリックを行う必要があります。しかし、numpyを使用した他のソリューションが存在すると思います。

edit : 数式が機能しない理由: np.put は何も返さず、最初のパラメーターで指定された要素を変更するだけです。使用中の良い答えnp.put()は次のとおりです。

a = np.zeros(10)
np.put(a,5,1)

問題は、配列を渡す前に配列を定義する必要があるため、1 行で実行できないことです。np.put()

于 2016-07-26T14:19:15.380 に答える
5

リスト内包表記を使用できます。

[0 if i !=5 else 1 for i in range(10)]

に変わります

[0,0,0,0,0,1,0,0,0,0]
于 2017-11-17T14:49:05.503 に答える
2

np.put配列 argを in-place に変更します。Noneインプレースミューテーションを実行して return ;を実行する関数/メソッドは、Python では慣習的です。np.putはその慣習に従います。したがって、aが 1D 配列の場合、

a = np.put(a, 5, 1)

a置き換えられNoneます。

あなたのコードはそれに似ていますが、名前のない配列をに渡しnp.putます。

必要なことを行うためのコンパクトで効率的な方法は、単純な関数を使用することです。

import numpy as np

def one_hot(i):
    a = np.zeros(10, 'uint8')
    a[i] = 1
    return a

a = one_hot(5) 
print(a)

出力

[0 0 0 0 0 1 0 0 0 0]
于 2016-07-26T14:47:10.097 に答える
2

ここでの問題は、配列をどこにも保存しないことです。このput関数は配列の代わりに機能し、何も返しません。配列に名前を付けることは決してないため、後でアドレス指定することはできません。したがって、この

one_pos = 5
x = np.zeros(10)
np.put(x, one_pos, 1)

うまくいきますが、インデックスを使用するだけです:

one_pos = 5
x = np.zeros(10)
x[one_pos] = 1

私の意見では、これをワンライナーとして行う特別な理由がなければ、これが正しい方法です。これは読みやすいかもしれませんし、読みやすいコードは良いコードです。

于 2016-07-26T14:27:29.397 に答える
2

マニュアルをざっと見てみると、np.putが値を返さないことがわかります。あなたのテクニックは問題ありませんがNone、結果配列の代わりにアクセスしています。

1 次元配列の場合、特にこのような単純なケースでは、直接インデックスを使用することをお勧めします。

最小限の変更でコードを書き直す方法は次のとおりです。

arr = np.zeros(10)
np.put(arr, 5, 1)

の代わりにインデックスを使用して 2 行目を行う方法を次に示しますput

arr[5] = 1
于 2016-07-26T14:27:48.443 に答える