入力がゼロの場合、次のような配列を作成します。
[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行で実装できる方法はありますか?
入力がゼロの場合、次のような配列を作成します。
[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行で実装できる方法はありますか?
何かのようなもの :
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()
リスト内包表記を使用できます。
[0 if i !=5 else 1 for i in range(10)]
に変わります
[0,0,0,0,0,1,0,0,0,0]
は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]
ここでの問題は、配列をどこにも保存しないことです。この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
私の意見では、これをワンライナーとして行う特別な理由がなければ、これが正しい方法です。これは読みやすいかもしれませんし、読みやすいコードは良いコードです。
マニュアルをざっと見てみると、np.put
が値を返さないことがわかります。あなたのテクニックは問題ありませんがNone
、結果配列の代わりにアクセスしています。
1 次元配列の場合、特にこのような単純なケースでは、直接インデックスを使用することをお勧めします。
最小限の変更でコードを書き直す方法は次のとおりです。
arr = np.zeros(10)
np.put(arr, 5, 1)
の代わりにインデックスを使用して 2 行目を行う方法を次に示しますput
。
arr[5] = 1