2012-12-06 2 views
2
  1. Numpy에서 (행, 열, 값) 트리플의 배열을 행렬로 변환하는 가장 쉬운 방법은 무엇입니까?
  2. 임의의 수의 색인이 있다면 어떨까요?
  3. 또한 행렬을 (행, 열, 값) 세 쌍으로 다시 변환하는 가장 쉬운 방법은 무엇입니까?

3에 대한 다음 작동하지만NumPy에서 (행, 열, 값) 세 쌍의 행렬 만들기

In [1]: M = np.arange(9).reshape((3,3)) 

In [2]: M 
Out[2]: 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 

In [3]: (rows, cols) = np.where(M) 

In [4]: vals = M[rows, cols] 

In [5]: zip(rows, cols, vals) 
Out[5]: 
[(0, 1, 1), 
(0, 2, 2), 
(1, 0, 3), 
(1, 1, 4), 
(1, 2, 5), 
(2, 0, 6), 
(2, 1, 7), 
(2, 2, 8)] 

매우 로터리 느낌 그리고 1의 다음 작품은하지만, 그냥 같은 scipy.sparse

In [6]: import scipy.sparse as sp 

In [7]: sp.coo_matrix((vals, (rows, cols))).todense() 
Out[7]: 
matrix([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 

답변

2

:

a=empty([max(rows)+1, max(cols)+1]) 
a[rows,cols] = vals 
array([[ 3.71697611e-307, 1.00000000e+000, 2.00000000e+000], 
    [ 3.00000000e+000, 4.00000000e+000, 5.00000000e+000], 
    [ 6.00000000e+000, 7.00000000e+000, 8.00000000e+000]]) 

귀하의 (0,0)에 대한 값이 없습니다. 목록, 따라서 이상한 가치. 여러 값에 대해 작동해야합니다. 인덱스를 다시 가져 오기 :

unravel_index(range(9), a.shape) 
(array([0, 0, 0, 1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2, 0, 1, 2])) 
+1

내 생각 엔 empty''zeros' 코드를 작동하게하는 그런 식으로'0으로 변경해야 누락 된 위치의 값입니다. –