在数组中获取字典值的向量,python

时间:2016-05-14 12:03:16

标签: python numpy dictionary sparse-matrix

我正在尝试获取一个numpy数组中特定字典值的向量。这是数组的样子:

import numpy as np
edge_array = np.array(
    [[1001, 7005, {'lanes': 9, 'length': 0.35, 'type': '99', 'modes': 'cw'}],
     [1001, 8259, {'lanes': 10, 'length': 0.46, 'type': '99', 'modes': 'cw'}],
     [1001, 14007, {'lanes': 7, 'length': 0.49, 'type': '99', 'modes': 'cw'}]])

我有一个矢量用于每行的前两个值(即10017005,但我需要另一个矢量用于与'lanes'相关联的值。

到目前为止,这是我的代码:

row_idx = edge_array[:, 0]
col_idx = edge_array[:, 1]
lane_values = edge_array[:, 2['lanes']]

我得到的错误如下:

lane_values = edge_array[:, 2['lanes']]
TypeError: 'int' object has no attribute '__getitem__'

如果您需要进一步澄清,请告诉我,谢谢!

3 个答案:

答案 0 :(得分:5)

子表达式2['lanes']没有意义:您正在索引数字2。

相反,请尝试:

[rec['lanes'] for rec in edge_array[:, 2]]

或者:

import operator
map(operator.itemgetter('lanes'), edge_array[:,2])

以上将为您提供常规Python list;如果你想要一个NumPy数组,你必须在列表中调用np.array()

但是这里更好的解决方案是将您的数据转换为具有命名列的“结构化数组”,然后您可以按名称进行有效索引。如果您的阵列有很多行,这将对效率产生很大影响。

答案 1 :(得分:2)

这不是一个完全有效的例子。难以理解。类型不清楚。我怀疑,你以某种方式使用numpy,但很难说,很难说。

无论如何,使用2 ['something']的索引是不正确的,错误会告诉您原因。尝试使用整数中的键进行索引。查看如何在python / numpy中完成索引。

但这就是 提取“车道”的方式:

map(lambda x: x['lanes'], edge_array[:, 2]))
# OR (if you want a vector/np-array)
vec_of_lanes = np.array(map(lambda x: x['lanes'], edge_array[:, 2])))

更多numpy风格:

vec_of_lanes = np.apply_along_axis(lambda x: x[2]['lanes'], 1, edge_array)

答案 2 :(得分:0)

@Zwinck建议使用结构化数组。这是实现这一目标的一种方式

为字典部分定义dtype。它具有不同dtypes的字段

dt = np.dtype([('f0',int,(2,)), ('f1',dt1)])

将dtype嵌入较大的dtype中。我为前两个值使用了子数组格式:

dt

现在创建数组。我编辑了您的表达式以适合edge_array1 = np.array( [([1001, 7005], ( 9, 0.35, '99','cw')), ([1001, 8259], ( 10, 0.46, '99','cw')), ([1001, 14007], (7, 0.49, '99', 'cw'))], dtype=dt) 。元组和列表的组合很重要。我本来可以从你的对象数组转移数据(todo?)

In [513]: edge_array1['f0']
Out[513]: 
array([[ 1001,  7005],
       [ 1001,  8259],
       [ 1001, 14007]])

现在可以通过' f0'来访问2个int值。字段名称:

In [514]: edge_array1['f1']['lanes']
Out[514]: array([ 9, 10,  7])

而'车道'通过字段名称索引的双重应用程序访问(因为它们是字段中的字段):

col-xs-2