我正在尝试获取一个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'}]])
我有一个矢量用于每行的前两个值(即1001
和7005
,但我需要另一个矢量用于与'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__'
如果您需要进一步澄清,请告诉我,谢谢!
答案 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