我想使用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]
},
答案 0 :(得分:0)
您展示的是一个字典,其值也是字典。嵌套字典的某些值是标量,其他值是列表。 neighbors
列表的长度各不相同。
我可以想象创建一个结构化数组,其中的字段对应于内部字典键。
coordinates
和v-state
字段的内部尺寸甚至可以是(2,)和(4,)。
但是对于可变长度neighbors
或hosts
我们可以做的最好的事情是将这些字段定义为具有对象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