2016-11-29 1 views
0

숫자 IDiM 매트릭스의 Mj으로 변환해야합니다. 표현은 다음Python : ID를 행렬 인덱스에 매핑하는 방법은 무엇입니까?

나는 dataframe df에서 오는 값을 저장해야
s = shape(M) 
j = (ID - 1) % s[0] 
i = np.int((ID - 1 - j)/s[0]) 

내가 반복 각 유형은 다음과 : 나는 궁금

M = np.zeros((m, n)) 
s = shape(M) 
for k in df.index: 
    ID = df['Id'][k] 
    y = (ID - 1) % s[0] 
    x = np.int((ID - 1 - y)/s[0]) 
    M[x,y] = M[x,y] + df['R'][k] 

루프 각을 피할 수있는 방법이 시간을 절약하고 계산 시간을 절약 할 수 있습니다.

답변

0

기본적으로 직접 MultiIndexi, j.unstack()을 사용하여 RSeries에서 매트릭스 M를 얻을 수 있습니다

import numpy as np 
import pandas as pd 

M = pd.DataFrame(index=range(4), columns=range(4)) 
s = M.shape 

df = pd.DataFrame({ 
    'ID': np.arange(4*4), 
    'R': np.random.rand(4*4), 
    }) 


df['j'] = df.ID % s[0] 
df['i'] = np.floor(df.ID/s[0]).astype(np.int) 

#In [26]: q.df 
Out[26]: 
#  ID   R j i 
# 0 0 0.847475 0 0 
# 1 1 0.343867 1 0 
# 2 2 0.806913 2 0 
# 3 3 0.105036 3 0 
# 4 4 0.170887 0 1 
# 5 5 0.782607 1 1 
# 6 6 0.377907 2 1 
# 7 7 0.586738 3 1 
# 8 8 0.895262 0 2 
# 9 9 0.290358 1 2 
# 10 10 0.109228 2 2 
# 11 11 0.423267 3 2 
# 12 12 0.454464 0 3 
# 13 13 0.604296 1 3 
# 14 14 0.603850 2 3 
# 15 15 0.974695 3 3 

df.set_index(['i', 'j'], inplace=True) 

M = df['R'].unstack() 

# In [30]: q.M 
# Out[30]: 
# j   0   1   2   3 
# i 
# 0 0.975895 0.506286 0.055459 0.551988 
# 1 0.846078 0.114153 0.981231 0.681130 
# 2 0.142864 0.050597 0.323655 0.918745 
# 3 0.734922 0.951795 0.209542 0.547859 
+0

이 매우 흥미 롭다. 그러나'M'을'4x4' 행렬로 변환해야합니다. 가능한가? – emax

+0

여기서'4x4' 차원은 단지 예일뿐입니다. 실제로는 'd1 * d2 = len (df)'인 임의의 차원 (d1, d2) 또는 null 값을 허용하는 경우 임의의 차원을 얻을 수 있습니다. –

+0

예를 들어 알 수 있습니다. 아래 예제를 보았다면, 0 행렬을 초기화 한 다음'df.index'에 따라 값을 할당하는 것입니다. – emax

0

을 여기 내 dataframe df을 나는 당신의 절차를 따라 후.

df.head(10): 
     Old1 ID R 
i j   
11 36 1169 0 0.0 
12 32 1268 1 0.0 
    34 1270 2 0.0 
    35 1271 3 2.0 
    36 1272 4 0.0 
    37 1273 5 0.0 
    40 1276 6 0.0 
    41 1277 7 0.0 
13 32 1371 8 7.0 
    33 1372 9 0.0 

는 것이 가능 행렬 값들을 연결하는 등, 즉

M[12][35]=2.0 
M[13][32]=7.0 

된다. 여기

은 내가 무엇을했는지 :

tmp = list(dftmp.index) 
tmp = pd.DataFrame(tmp) 
tmp.columns = ('a','b') 
M[tmp.a, tmp.b] = dftmp.I 
관련 문제