如何在ndarray中定义字典结构

时间:2014-12-01 11:54:05

标签: python python-2.7 numpy multidimensional-array

我想创建一个三维数组,数组中的每个值代表一个字典。

例如:myArray[m][n][k]

类型的{'position':(0,0), 'boundary': [(8,8)(512,512)]}

我知道,可以通过在dtype

中指定numpy.ndarray参数来定义它
numpy.ndarray(shape=(m, n, k), dtype=...)

dtype应该指定如上所述的确切字典语法

2 个答案:

答案 0 :(得分:2)

AFAIK没有。您可以做的最好的事情是定义dtype = object(例如,如果您尝试设置dtype=dict,则会获得这些内容) - 然后手动填充它。什么都不能确保字典的结构("语法",如你所说) - 你可以使用一个类。

然而,请注意numpy针对标量变量进行了优化,您的使用非常奇怪。

答案 1 :(得分:1)

如果您只需要命名列并且列集是不可变的,则可以使用记录数组:

In [30]: arr = np.zeros((3,3), dtype=[('position', 'f8', 2),
                                      ('boundary', 'i8', (2,2))]); arr
Out[30]: 
array([[([0.0, 0.0], [[0, 0], [0, 0]]), ([0.0, 0.0], [[0, 0], [0, 0]]),
        ([0.0, 0.0], [[0, 0], [0, 0]])],
       [([0.0, 0.0], [[0, 0], [0, 0]]), ([0.0, 0.0], [[0, 0], [0, 0]]),
        ([0.0, 0.0], [[0, 0], [0, 0]])],
       [([0.0, 0.0], [[0, 0], [0, 0]]), ([0.0, 0.0], [[0, 0], [0, 0]]),
        ([0.0, 0.0], [[0, 0], [0, 0]])]], 
      dtype=[('position', '<f8', (2,)), ('boundary', '<i8', (2, 2))])

In [31]: arr['boundary'][0] = [[1,2], [3,4]]

In [32]: arr
Out[32]: 
array([[([0.0, 0.0], [[1, 2], [3, 4]]), ([0.0, 0.0], [[1, 2], [3, 4]]),
        ([0.0, 0.0], [[1, 2], [3, 4]])],
       [([0.0, 0.0], [[0, 0], [0, 0]]), ([0.0, 0.0], [[0, 0], [0, 0]]),
        ([0.0, 0.0], [[0, 0], [0, 0]])],
       [([0.0, 0.0], [[0, 0], [0, 0]]), ([0.0, 0.0], [[0, 0], [0, 0]]),
        ([0.0, 0.0], [[0, 0], [0, 0]])]], 
      dtype=[('position', '<f8', (2,)), ('boundary', '<i8', (2, 2))])