2016-10-24 3 views
1

파이썬에서 열 키와 행 키를 2 차원 배열을 만듭니다 2-d array structure내가 파이썬에서이 데이터 구조를 만들려고하고

열 키행 키 I 될 것해야 나중에 사용. 열 키와 행 키는 임의의 숫자입니다. 대한

지금이 코드를 가지고 :

import random 

cols, rows = 5, 5 
Matrix = [[0 for x in range(cols)] for y in range(rows)] 

set_col = 0 
for row in Matrix: 
    row[set_col] = random.randint(1,2) 

columnKeys = random.sample(range(1,5), 4) 
Matrix[0] = columnKeys 

for row in Matrix: 
    print(row) 

출력 :

[3, 1, 2, 4] 
[2, 0, 0, 0, 0] 
[1, 0, 0, 0, 0] 
[2, 0, 0, 0, 0] 
[1, 0, 0, 0, 0] 

이 내가 원하는 꽤 것이 아니다. 지금은 각 셀 값이 0입니다. 그러나 나중에 관련 데이터가있을 것이며 에 해당하는 행 및 열 키와 함께이 데이터를 사용할 것입니다. 필자는이 데이터 구조를 올바르게 구성하는 방법을 모르므로 셀 값을 해당 행/열 키와 함께 사용할 수 있습니다.


어떻게 내가 열 및 행 키를 사용할 수 있습니다 팬더NumPy와없이 그것을 을 할까?

답변

1

.

이 아닌은 중첩 목록을 사용하지만 대신 사전을 사용하는 것이 가장 좋습니다. 당신이 팬더를 언급했기 때문에, 팬더 DataFrame 객체는 DataFrame을 사전으로 변환하는 to_dict 함수를 가지고 있으며, 원하는 것에 따라 몇 가지 옵션이 있습니다.

중복 된 인덱스를 사용하여 데이터 구조를 만드는 중입니다. 여기서 가장 좋은 옵션은 df.to_dict("split")을 실행하여 생성 된 구조를 사용하는 것입니다.

 3 1 2 4 
    2 0 0 0 0 
    1 0 0 0 0 
    2 0 0 0 0 
    1 0 0 0 0 

실행`df.to_dict ("분할") 다음이 작업을 수행합니다 :

d = df.to_dict("split") 
{ 
    'columns': [3, 1, 2, 4], 
    'data': [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], 
    'index': [2, 1, 2, 1] 
} 

데이터에 접근을이 시나리오에서, 그리고

은 DataFrame (DF)는 다음과 같습니다 말 @Makiflow가 보여주는 것은 까다 롭습니다. Pandas 내에서도 Dataframe에 중복 된 인덱스 또는 컬럼을 사용하면 작업이보다 재미 있습니다. 이 경우 df['data'][3][1]을 선택하면 data 키에 포함 된 세 번째 목록의 두 번째 요소가 선택됩니다. 실제로 행렬의 4 행 2 열을 선택합니다. 이름이 인 항목을 참조 할 수있게하려면 다리 작업을 조금 더해야합니다.

의 색인 값을 제공하는 col_num = d['columns'].index(3)을 실행할 수 있지만 d['index'].index(2)을 수행하면 색인 3에서 2를 선택하려는 경우에도 항상 0이됩니다.index()은 조건과 일치하는 첫 번째 값의 인덱스를 반환하기 때문입니다. 물론 (col, row) 인덱스 튜플로 선택할 수는 있지만, 처음에는 열 이름과 인덱스 값을 갖는 목적을 상실합니다. 당신이 팬더없이이 구조를 생성 할 경우

, 당신은 실행할 수 있습니다 COLS, ROWS = 5, 5 열 = _ 범위 (COLS)에 대한 random.randint (0, COLS)] 행을 = [ 범위에 _ 대한 random.randint (1,2) (행)]

d = {"columns": columns, 
    "index": rows, 
    "data": [[0 for _ in range(COLS)] for _ in range(ROWS)] 
    } 

이럴 - 더 나은 솔루션이 실제로 고유 인덱스 및 열 값을 가지고 데이터 구조를 강제하는 것입니다. to_dict() 출력됩니다 아주 간단하게 사전의 기본 출력 :

d = df.to_dict() # also the same as df.to_dict("dict") 
{ 
    1: {1: 0, 2: 0}, 
    2: {1: 0, 2: 0}, 
    3: {1: 0, 2: 0}, 
    4: {1: 0, 2: 0} 
} 

이 구성에서, 사전에 각 키 컬럼의 이름입니다. 각 키는 해당 열의 정보를 나타내는 다른 dicitonary를 가리 킵니다. 각 키는 인덱스 값이고 그 뒤에 값이옵니다.

당신이 1라는 이름의 인덱스 3라는 이름의 열 에서 값을 얻을 원한다면 당신이 할 것이기 때문에이 가능성이 가장 직관적 의미가 있습니다 :

d = df.to_dict() 
    d[3][1] 
    # 0 

는이 데이터를 생성 할 수 있습니다 구조는 팬더를 사용하지 않고 간단하게 :

COLS, ROWS = 5,5 
rows = [i for i in range(ROWS)] 
columns = [i for in range(COLS)] 
{c : {i:0 for i in rows} for c in columns} 
# { 
# 0: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}, 
# 1: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}, 
# 2: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}, 
# 3: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}, 
# 4: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 
# } 

정말 제약 조건/요구 사항에 따라 달라집니다.

1
import random 

COLS, ROWS = 5, 5 
Matrix = [[0 for x in range(COLS)] for y in range(ROWS)] 

set_col = 0 
for row in Matrix: 
    row[set_col] = random.randint(1,2) 

columnKeys = random.sample(range(1,5), 4) 
Matrix[0] = [0] + columnKeys 

for row in Matrix: 
    print(row) 

출력 그것은 당신이 원하는에 따라 달라집니다

[0, 3, 1, 2, 4] 
[2, 0, 0, 0, 0] 
[1, 0, 0, 0, 0] 
[2, 0, 0, 0, 0] 
[1, 0, 0, 0, 0]