1

私が言葉で何をしようとしているのかを説明するのは難しいので、ここに例を示します。

次の入力があるとしましょう。

In [76]: x
Out[76]: 
0    a
1    a
2    c
3    a
4    b

In [77]: z
Out[77]: ['a', 'b', 'c', 'd', 'e']

私は手に入れたい:

In [78]: ii
Out[78]: 
array([[1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0]])

iiz元のを取り戻すために適用できるブールマスクの配列ですx

z私の現在の解決策は、に変換し、メソッドをlist使用して要素のインデックスを取得し、1が存在するインデックスを除いてゼロの行を生成する関数を作成することです。この関数は、の各行に適用され、目的の結果を取得します。indexzx

4

3 に答える 3

1

最初の可能性:

>>> choices = np.diag([1]*5)
>>> choices[[z.index(i) for i in x]]

[z.index(i) for i in x]他の場所で述べたように、リスト内包表記は次の方法で変更できます。np.searchsorted(z, x)

>>> choices[np.searchsorted(z, x)]

@sebergのコメントで示唆されているように、のnp.eye(len(x))代わりにを使用する必要があることに注意してくださいnp.diag([1]*len(x))。このnp.eye関数は、対角線上に1、他の場所に0の2D配列を直接提供します。

于 2012-09-12T08:15:50.417 に答える
1

これは、zがソートされている場合のnumpyメソッドです。あなたはそれを特定しませんでした...パンダが何か違うものを必要とするなら、私は知りません:

# Assuming z is sorted.
indices = np.searchsorted(z, x)

ブールマスクが必要な理由がわかりません。これらのインデックスをzに適用して、xを既に返すことができ、よりコンパクトになります。

z[indices] == x # if z included all x.
于 2012-09-12T08:47:14.890 に答える
1

誰も驚いたことに:のouter方法について言及していませんnumpy.equal

In [51]: np.equal.outer(s, z)
Out[51]: 
array([[ True, False, False, False, False],
       [ True, False, False, False, False],
       [False, False,  True, False, False],
       [ True, False, False, False, False],
       [False,  True, False, False, False]], dtype=bool)

In [52]: np.equal.outer(s, z).astype(int)
Out[52]: 
array([[1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0]])
于 2012-10-24T16:23:56.793 に答える