2017-09-28 17 views
2

Iは20の有限の値を有する3-27の範囲の値のセットを、有する:ビンに基づいて行列を作成する方法は?

A = [(0,21),(1,12),(2,15),(3,3),(4,21),(5,15),(6,27),(7,21),(8,9),(9,27),(10,12),(11,9),(12,12),(13,3),(14,9),(15,12),(16,6),(17,3),(18,9),(19,15)] 
Iは、の範囲を有する各9個のビンを有することになるnumpyのアレイを作成する方法を学びたい

指定されたタプル[1]に対して-1と+1の整数、3〜27の範囲の3の倍数です(ただし、これは整数と範囲の他の組み合わせと互換性があります)。最後に、私は次のようになりますマトリックスを作成できるようにしたいと思います:

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

私はnumpyのは(num, bins) = histogram(x, bins=None, range=None)を持っていますが、私はそれで行くにはどのように非常によく分からないどのように読んでいました。

ユニークな値( 'a')を取得し、範囲を(a-1、a + 1)とするために 'A'を繰り返して、ビンの数を取得する必要があると考えていました。ちょうどlen(unique_values)になります。しかし、その後、私は失われています。誰も私を導くことができますか?

out = np.zeros((len(ids), 9),dtype=int) 
out[np.arange(len(ids)), ids] = 1 

タプルの最初の要素があった場合 - 配列 - 初期化によって置き換えることができ

bins = np.arange(3,28,3) 
ar = np.asarray(A)[:,1] # or np.array([i[1] for i in A]) 
ids = np.searchsorted(bins, ar) # or np.digitize(ar,bins)-1 
out = (ids[:,None] == np.arange(9)).astype(int) 

最終的な出力を得るために、最後のステップ -

答えて

2

はここnp.searchsorted/np.digitizeと片道です連続していない場合は、それらを使用して行にインデックスを付けることができます。 -

out[np.asarray(A)[:,0], ids] = 1 

サンプルラン -

In [205]: A 
Out[205]: 
[(0, 21), 
(1, 12), 
(2, 15), 
(3, 3), 
(4, 21), 
(5, 15), 
(6, 27), 
(7, 21), 
(8, 9), 
(9, 27), 
(10, 12), 
(11, 9), 
(12, 12), 
(13, 3), 
(14, 9), 
(15, 12), 
(16, 6), 
(17, 3), 
(18, 9), 
(19, 15)] 

In [206]: out[:7] # first 7 rows of output 
Out[206]: 
array([[0, 0, 0, 0, 0, 0, 1, 0, 0], 
     [0, 0, 0, 1, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1, 0, 0, 0, 0], 
     [1, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 1, 0, 0], 
     [0, 0, 0, 0, 1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 1]]) 
+0

完璧な答え!ありがとうございました!! – Daniel

関連する問題