在python中创建一个结构化数组

时间:2016-09-19 14:32:08

标签: python arrays numpy structure

我想使用numpy命令在Python中创建一个字典。

首先,我尝试定义结构,然后根据用户选择的数字/大小写填充数组。当我尝试请求其中一个案例时,我收到以下错误(对于案例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  

1 个答案:

答案 0 :(得分: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将是字典词典。