2015-11-02 71 views
0

我有一种情况,我想做到以下几点:在NumPy的结构数组访问元素

import numpy as np 
type1 = np.dtype([('col1', 'i'), ('col2', 'i')]) 
type2 = np.dtype([('cols', type1), ('info', 'S32')]) 
data = np.zeros(10, type2) 

# The following doesn't work, but I want to do something similar 
index = ['cols']['col1'] 
# Set column ['cols']['col1'] to 5 
data[index] = 5 

# I can only get this to work if I do the following: 
index = "['cols']['col1']" 
eval('data' + index '= 5') # kinda scary 

这是不行的,但我发现使用exec功能的方法,但那种感觉很哈克。有没有人有任何建议如何以编程方式为嵌套结构化numpy数据类型创建索引?

感谢

+0

为什么你不能用'数据[ '的cols'] [ 'COL1'] = 5'? – user3148185

+0

,因为我需要能够在不幸的是单独的步骤来定义的索引。 – user985030

+1

如果你定义他们像'索引1,索引2 = '的cols',“col1''和使用'数据[索引1] [索引2]'? – user3148185

回答

1

这会工作:

index = ['cols', 'col1'] 
data[index[0]][index[1]] = 5 

UPDATE

这允许值的设置,在任何深度:

def set_deep(obj, names, value): 
    if len(names) > 1: 
     obj = obj[names[0]] 
     if len(names) > 2: 
      for name in names[1:-1]: 
       obj = obj[name] 
    obj[names[-1]] = value 

用法:

set_deep(data, ['cols', 'col1'], 5) 

set_deep(data, ['a', 'b', 'c', 'd'], 5) 
+0

谢谢,这是接近我可能最终不得不使用,但构成的,不只是2深数据类型。我有可能像'的数据定义的事物[ '一'] [ 'B'] [ 'C'] [ 'D']'。在这种情况下,我想我可以做一个for循环或什么。 – user985030

+0

我认为这可能是亲如我们可以在不使用'exec'说法得到。 – user985030