【问题标题】:Getting a vector of dictionary values in an array, python在数组中获取字典值的向量,python
【发布时间】:2016-05-14 12:03:15
【问题描述】:

我正在尝试获取 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__'

如果您需要任何进一步的说明,请告诉我,谢谢!

【问题讨论】:

  • 注意这个数组的dtypeobjectedge_array[:,2] 在功能上与字典列表相同。所以你必须使用列表操作(映射、理解)来对各个字典进行操作。

标签: python numpy dictionary sparse-matrix


【解决方案1】:

子表达式 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()

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

【讨论】:

  • 我尝试这样做时收到以下错误:lane_values = edge_array[:, 2]['lanes'] IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices
  • @AndrewEarl:现在你已经用准确的输入数据更新了你的问题,我用准确的解决方案更新了我的答案。
  • 像魅力一样工作!谢谢。我会考虑制作一个结构化数组,因为我有很多很多行。
【解决方案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)

【讨论】:

  • 嗨,谢谢,现在就试试。您如何建议创建一个完整的工作示例?是不是因为edge_array 在您的代码中不起作用?
  • 问题是,您刚刚向我们展示了打印输出,因此它不是有效的 Python 语法,因为省略了逗号。还不清楚您是索引列表还是 numpy 数组。
  • 好的,我正在使用一个 numpy 数组并对其进行了编辑。很抱歉我是个业余爱好者,但是,一旦我实现了:map(lambda x: x['lanes'], edge_array[:, 2])) 如何从lanes 的值中创建一个向量?
  • 我认为您应该阅读更多文档,因为您缺少基本的东西!我将编辑答案。
  • 太棒了!你的作品也像一个魅力。谢谢。我肯定会更多地阅读我的基础知识。
【解决方案3】:

@Zwinck 建议使用结构化数组。这是这样做的一种方法

为字典部分定义一个数据类型。它具有不同 dtypes 的字段

dt1 = np.dtype([('lanes',int), ('length',float), ('type','S2'),('modes','S2')])

将该 dtype 嵌入到更大的一个中。我对前 2 个值使用了子数组格式:

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

现在创建数组。我编辑了你的表情以适应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)

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

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

虽然“车道”是通过双重应用字段名称索引来访问的(因为它们是字段中的一个字段):

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

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多