2017-09-28 5 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의 배수 (그러나 이것은 정수와 범위의 다른 조합으로 바꿔야합니다). 내가 NumPy와는 (num, bins) = histogram(x, bins=None, range=None)을 가지고 방법에 읽고 있던

[[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], 
....] 

하지만 난 그로 이동하는 방법을 아주 확실하지 않다 : 결국, 내가 이렇게 보이는 행렬을 만들 수 있도록하고 싶습니다.

고유 한 값 ('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