2017-07-19 5 views
3

ご迷惑をお掛けして申し訳ございません。私は以下のような配列を持っています: [[3,7,9,5],[3,3,7,5]]、はるかに大きいですが。ユニークな値を最も低いフォームに減らす配列を作成する方法はありますか?

[[0,2,3,1],[0,0,2,1]]のような形式に変換するにはどうすればよいでしょうか?最低で始まる一意の各値には、0から始まる識別番号が付けられます。現在私はforループを使用していますが、非常に遅いです。これを高速化できるnumpyの関数はありますか?

+1

だから、彼らは、リストあたりの要素の数が可変を持っているようなので、あなたは、リストの配列を持っていますか? – Divakar

+0

また、各リストの最小要素またはすべてのリストの最小値を見つけて、配列全体を正規化しますか?あなたの例は、これを明示していないのでやや悪いです。 – JohanL

+0

また、可変長のリストはありますか? –

答えて

5

np.uniqueを使用して、任意の引数return_inverseTrueと設定して1つの方法を使用できます。これは入力が一杯になると入力を平らにし、0から順番に一意のIDを与えます。配列がフラット化されているため、配列内のすべての要素にわたって一意性が維持されます。したがって、出力は入力と同じ形状に戻すために後で形状を変更する必要があります。

したがって、実装は次のようになり -

np.unique(a, return_inverse=True)[1].reshape(a.shape) 

サンプル実行 -

In [208]: a = np.array([[3,7,9,5],[3,3,7,5]]) 

In [209]: np.unique(a, return_inverse=True)[1].reshape(a.shape) 
Out[209]: 
array([[0, 2, 3, 1], 
     [0, 0, 2, 1]]) 
+0

あなたの答えは*常に*動作しません。例えば、 'a [= 1,2]、[3,4,5,0]]とすると、' [[0、2、3、1]、[0、0、2、1 、3]] ' –

+0

@AGNGazer本当にね?私は '[[0、1]、[1、2、3、0]]'を得る。 OPの 'a'ではなく' a'を使用していますか? – Divakar

+0

ああ、愚かなコピー(間違った行から)/間違いを貼り付けてください。確かに、私は '[[0、1]、[1,2,3、0]]も得ます。しかし、質問を正しく理解すれば '[[1,2]、[3、4、5、0]]と思っていたでしょう。つまり、 'unique()'を平坦化されたリスト上で実行する必要があると思います。 –

関連する問題