2016-09-19 44 views
0

Pythonでnumpyコマンドを使って辞書を作成したいと思います。Pythonで構造化配列を作成

まず、構造体を定義してから、ユーザーが選択した数値/ケースに従って配列を作成しようとしました。私は(ケース1の場合)次のエラーを取得する例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

また、ゼロ配列の作成時に既にエントリの長さを定義する必要があることも重要です。したがって、同じ配列は、長さが異なるため、定義した異なるケースには適していません。この方法で構造化配列を使用するのは難しいかもしれません。 – 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')1つの文字です。それが持つことができるのはすべてです。リストを保持することはできません。あなたはそれがサイズになるように定義されている場合でも

(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は辞書の辞書になります。