2016-08-02 6 views
4

{(k,i): value, ...}이라는 항목이있는 사전이 있습니다. 이제이 사전을 두 번째 배열로 변환하려고합니다. 여기서 배열의 요소에 대해 [k,i] 위치에 지정된 값은 (k,i)이라는 사전의 값입니다. 행의 길이는 반드시 같은 크기 일 필요는 없습니다 (예 : 행 k = 4i = 60까지 올라갈 수 있고 행 k = 24은 색인 i = 31까지 올라갈 수 있습니다). 비대칭 성 때문에 직사각형 행렬을 가지기 위해 특정 행의 모든 ​​추가 항목을 0과 동일하게 만드는 것이 좋습니다.알려진 색인이있는 사전을 다차원 배열로 변환

# Get keys (as indices for output) and values as arrays 
idx = np.array(d.keys()) 
vals = np.array(d.values()) 

# Get dimensions of output array based on max extents of indices 
dims = idx.max(0)+1 

# Setup output array and assign values into it indexed by those indices 
out = np.zeros(dims,dtype=vals.dtype) 
out[idx[:,0],idx[:,1]] = vals 

우리는 또한 최종 출력을 얻기 위해 스파 스 매트릭스를 사용할 수 있습니다 -

+0

샘플 입력/출력? –

답변

3

여기에 접근합니다. 예 : coordinate format sparse matrices. 스파 스 매트릭스로 유지하면 메모리가 효율적입니다. 그래서, 마지막 단계는 이런 식으로 대체 될 수 -

from scipy.sparse import coo_matrix 

out = coo_matrix((vals, (idx[:,0], idx[:,1])), dims).toarray() 

샘플 실행 -

In [70]: d 
Out[70]: {(1, 4): 120, (2, 2): 72, (2, 3): 100, (5, 2): 88} 

In [71]: out 
Out[71]: 
array([[ 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 120], 
     [ 0, 0, 72, 100, 0], 
     [ 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0], 
     [ 0, 0, 88, 0, 0]]) 

치수의 수의 ndarrays 것이 일반적인 만들려면, 우리는 직쇄 사용할 수 있습니다 출력 배열에 값을 할당하려면 np.put을 사용하십시오.

np.put(out,np.ravel_multi_index(idx.T,dims),vals) 

샘플 실행 - - 따라서, 우리의 첫 번째 방법에서, 단지 이런 식으로 뭔가에 값을 할당하는 마지막 단계를 대체

In [106]: d 
Out[106]: {(1,0,0): 99, (1,0,4): 120, (2,0,2): 72, (2,1,3): 100, (3,0,2): 88} 

In [107]: out 
Out[107]: 
array([[[ 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0]], 

     [[ 99, 0, 0, 0, 120], 
     [ 0, 0, 0, 0, 0]], 

     [[ 0, 0, 72, 0, 0], 
     [ 0, 0, 0, 100, 0]], 

     [[ 0, 0, 88, 0, 0], 
     [ 0, 0, 0, 0, 0]]]) 
0

될 수있는 사전 -의 - 키 드문 드문 형식이 이런 식으로 사전에서 만들었습니다. Divakar'sd 샘플을 시작으로

:

In [1190]: M=sparse.dok_matrix((6,5),dtype=int) 
In [1191]: M 
Out[1191]: 
<6x5 sparse matrix of type '<class 'numpy.int32'>' 
    with 0 stored elements in Dictionary Of Keys format> 

가 사전 update를 통해 d 값을 추가

In [1189]: d={(1, 4): 120, (2, 2): 72, (2, 3): 100, (5, 2): 88} 

오른쪽 모양과 DTYPE의 빈 스파 스 매트릭스를 확인합니다. 이 특정 희소 형식이 dict 하위 클래스이므로이 방법이 효과적입니다. 이 트릭은 (적어도 제가 알고 있음) 문서화되지 않도록 불구하고 제품 수 :

In [1192]: M.update(d) 
In [1193]: M 
Out[1193]: 
<6x5 sparse matrix of type '<class 'numpy.int32'>' 
    with 4 stored elements in Dictionary Of Keys format> 
In [1194]: M.A # convert M to numpy array (handy display trick) 
Out[1194]: 
array([[ 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 120], 
     [ 0, 0, 72, 100, 0], 
     [ 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0], 
     [ 0, 0, 88, 0, 0]]) 

M는 다른 스파 스 형식으로 csrcoo을 변환 할 수 있습니다. 실제로 sparse은 사용 (디스플레이, 계산 등)에 따라 이러한 종류의 변환을 단독으로 수행합니다.

In [1196]: print(M) 
    (2, 3) 100 
    (5, 2) 88 
    (1, 4) 120 
    (2, 2) 72 
관련 문제