2016-09-19 1 views
0

numpy 명령을 사용하여 파이썬으로 사전을 만들고 싶습니다.파이썬에서 구조화 된 배열 만들기

먼저 구조체를 정의한 다음 사용자가 선택한 숫자/대소 문자를 기준으로 배열을 채 웁니다. 내가 (경우 1) 다음과 같은 오류가 사례 중 하나를 요청하려고 할 때 :

cannot copy sequence with size 3 to array axis with dimension 1 

어떻게 내 구조에서 원하는 데이터를 저장할 수 있도록하기 위해 내 코드를 해결할 수 있습니까? 내가 선택한 경우에 관계없이.

# defining the structure 
usgStruct = np.zeros(1,dtype = [("satNr",np.int), 
          ("satAzimuth", np.int), 
          ("satElevation", np.int), 
          ("scenarioEnv", np.str), 
          ("scenarioHead", np.int), 
          ("scenarioLen", np.int), 
          ("speed", np.int)]) 

def case1(): 
    usgStruct["satNr"]  = 3 
    usgStruct["satAzimuth"] = [180, 200, 235] 
    usgStruct["satElevation"] = [35, 25, 25] 
    usgStruct["scenarioEnv"] = ["S", "S", "S", "U", "U"] 
    usgStruct["scenarioHead"] = [45, 280, 45, 120, 200] 
    usgStruct["scenarioLen"] = [2000, 500, 3000, 2000, 500] 
    usgStruct["speed"]  = [15, 15, 15, 10, 10] 
    return usgStruct 


def case2(): 
    usgStruct["satNr"]   = 2 
    usgStruct["satAzimuth"]  = [180, 225] 
    usgStruct["satElevation"] = [45, 30] 
    usgStruct["scenarioEnv"] = ["U", "U", "O", "O", "S", "S", "S"] 
    usgStruct["scenarioHead"] = [30, 65, 65, 80, 80, 60, 130] 
    usgStruct["scenarioLen"] = [300, 800, 2000, 1000, 700, 700, 300] 
    usgStruct["speed"]   = [10, 10, 15, 15, 15, 15, 15] 
    return usgStruct 


def case3(): 
    usgStruct["satNr"]  = 2   
    usgStruct["satAzimuth"] = [180, 225] 
    usgStruct["satElevation"] = [35, 30] 
    usgStruct["scenarioEnv"] = ['C', 'C', 'C', 'C', 'O']     
    usgStruct["scenarioHead"] = [90, 45, 120, 70, 45]  
    usgStruct["scenarioLen"] = [1500, 500, 300, 2000, 3000] 
    usgStruct["speed"]  = [15, 15, 15, 15, 20] 
    return usgStruct 

# set up a dictionary of actions 

scenarioGenerator = { 
    "1": case1, 
    "2": case2, 
    "3": case3} 

runscenGen = raw_input("Please enter a number from 1 to 7\n ") 
scenarioGenerator.get(runscenGen,case3)()      # specify a default: case3  

print usgStruct 
+0

문제는 처음에 배열 정의 (dtype)가 채우기를 원하는 데이터의 종류를 따르지 않는다는 것입니다. 특히 데이터의 차원을 무시할 수 없습니다. 아래 예제를 참조하십시오. http://docs.scipy.org/doc/numpy/user/basics.rec.html – dnalow

+0

나를 위해 그것을 좁혀 주셔서 감사합니다, 나는 모양을하고 이해하려고합니다. –

+0

또한 0 배열을 만들 때 이미 항목의 길이를 정의해야한다는 것도 중요 할 수 있습니다. 따라서 동일한 배열은 길이가 다르기 때문에 사용자가 정의한 서로 다른 경우에 적합하지 않습니다. 이러한 방식으로 구조화 된 배열을 사용하는 것은 어려울 수 있습니다. – dnalow

답변

0

인쇄 초기 usgStruct 배열 :

여기 내 코드입니다

In [329]: usgStruct 
Out[329]: 
array([(0, 0, 0, '', 0, 0, 0)], 
     dtype=[('satNr', '<i4'), ('satAzimuth', '<i4'), ('satElevation', '<i4'), ('scenarioEnv', '<U'), ('scenarioHead', '<i4'), ('scenarioLen', '<i4'), ('speed', '<i4')]) 

데이터는 6 개 숫자와 (내 py3에 'U') 한 문자입니다. 그것이 가질 수있는 전부입니다. 목록을 보유 할 수 없습니다. 당신이 크기로 정의해도

(3)

In [331]: usgStruct 
Out[331]: 
array([(0, 0, 0, '', 0, 0, 0), (0, 0, 0, '', 0, 0, 0), 
     (0, 0, 0, '', 0, 0, 0)], 
     dtype=[('satNr', '<i4'), ('satAzimuth', '<i4'), ('satElevation', '<i4'), ('scenarioEnv', '<U'), ('scenarioHead', '<i4'), ('scenarioLen', '<i4'), ('speed', '<i4')]) 

개인 기록은 여전히 ​​7 요소 튜플이다.

귀하는 case 데이터가 완전히 다릅니다. 각각의 경우는 목록 값이있는 사전과 같습니다. case1을 변경하면 생산하고 사전으로 돌아 가기 :

In [334]: def case1(): 
    ...: usgStruct={} 
    ...: usgStruct["satNr"]  = 3 
    ...: usgStruct["satAzimuth"] = [180, 200, 235] 
    ...: usgStruct["satElevation"] = [35, 25, 25] 
    ...: usgStruct["scenarioEnv"] = ["S", "S", "S", "U", "U"] 
    ...: usgStruct["scenarioHead"] = [45, 280, 45, 120, 200] 
    ...: usgStruct["scenarioLen"] = [2000, 500, 3000, 2000, 500] 
    ...: usgStruct["speed"]  = [15, 15, 15, 10, 10] 
    ...: return usgStruct 
    ...: 
In [335]: case1() 
Out[335]: 
{'satAzimuth': [180, 200, 235], 
'satElevation': [35, 25, 25], 
'satNr': 3, 
'scenarioEnv': ['S', 'S', 'S', 'U', 'U'], 
'scenarioHead': [45, 280, 45, 120, 200], 
'scenarioLen': [2000, 500, 3000, 2000, 500], 
'speed': [15, 15, 15, 10, 10]} 

지금 scenarioGenerator이 사전의 사전 될 것입니다.