如何在numpy中实现值为可变长度数组的字典

时间:2017-04-25 16:34:09

标签: python numpy dictionary

我想使用numpy来实现以下数据结构。现在我使用python字典来完成工作,但是很难做矢量操作,我必须多次添加矢量,所以我想使用numpy来简化工作。程序执行期间主机的长度会有所不同。我是否可以使用numpy结构化数组来完成这项工作,请注意列表的长度是可变的?我不熟悉它,只是想知道它是否可能,这样就不会浪费时间。

{
  "0" :{
      "coordinates": [100, 100],
      "neighbours": [1, 40],
      "hosts":[],
      "v-capacity":20,
      "v-immature":0,
      "v-state":[20, 0, 0, 0]
  },
  "1" :{
      "coordinates": [200, 100],
      "neighbours": [0, 2, 41],
      "hosts":[],
      "v-capacity":20,
      "v-immature":0,
      "v-state":[20, 0, 0, 0]
  },

1 个答案:

答案 0 :(得分:0)

您展示的是一个字典,其值也是字典。嵌套字典的某些值是标量,其他值是列表。 neighbors列表的长度各不相同。

我可以想象创建一个结构化数组,其中的字段对应于内部字典键。

coordinatesv-state字段的内部尺寸甚至可以是(2,)和(4,)。

但是对于可变长度neighborshosts我们可以做的最好的事情是将这些字段定义为具有对象dtype,它将相应的列表存储在内存中的其他位置。这种阵列的数学是有限的。

但是在深入研究结构化数组之前,请探索创建一组数组来存储这些数据,在out字典中每个项目一个row

coordinates = np.array([[100,100],[200,100]])
neighbors = np.array([[1, 40],[0, 2, 41]])

确保您了解这些表达式产生的内容。

In [537]: coordinates
Out[537]: 
array([[100, 100],
       [200, 100]])
In [538]: neighbors
Out[538]: array([[1, 40], [0, 2, 41]], dtype=object)

这是一个可以容纳这些数组的结构化数组的例子:

In [539]: dt=np.dtype([('coordinates',int,(2,)),('neighbors',object)])
In [540]: arr = np.zeros((2,), dtype=dt)
In [541]: arr
Out[541]: 
array([([0, 0], 0), ([0, 0], 0)], 
      dtype=[('coordinates', '<i4', (2,)), ('neighbors', 'O')])
In [543]: arr['coordinates']=coordinates
In [544]: arr['neighbors']=neighbors
In [545]: arr
Out[545]: 
array([([100, 100], [1, 40]), ([200, 100], [0, 2, 41])], 
      dtype=[('coordinates', '<i4', (2,)), ('neighbors', 'O')])
In [546]: arr['neighbors']
Out[546]: array([[1, 40], [0, 2, 41]], dtype=object)

请注意,这基本上是一种包装方便。它将数组存储在一个位置,但您仍然可以在各个字段上执行数学/向量运算。

In [547]: coordinates.sum(axis=1)
Out[547]: array([200, 300])     # sum across columns of a 2d array
In [548]: neighbors.sum()
Out[548]: [1, 40, 0, 2, 41]    # sum (concatenate) of lists